@@ -37,8 +37,9 @@ struct ring_buffer {
37
37
uint8_t buffer[CDC_SERIAL_BUFFER_SIZE];
38
38
volatile uint32_t head;
39
39
volatile uint32_t tail;
40
+ volatile bool full;
40
41
};
41
- ring_buffer cdc_rx_buffer = { { 0 }, 0 , 0 };
42
+ ring_buffer cdc_rx_buffer = {{ 0 }, 0 , 0 , false };
42
43
43
44
typedef struct {
44
45
uint32_t dwDTERate;
@@ -160,19 +161,22 @@ void Serial_::accept(void)
160
161
// current location of the tail), we're about to overflow the buffer
161
162
// and so we don't write the character or advance the head.
162
163
uint32_t k = 0 ;
163
- i = (i + 1 ) % CDC_SERIAL_BUFFER_SIZE;
164
- while ((i != ringBuffer->tail ) && (len > 0 )) {
164
+ while (len > 0 && !ringBuffer->full ) {
165
165
len--;
166
- ringBuffer->buffer [ringBuffer->head ] = buffer[k++];
167
- ringBuffer->head = i;
168
- i = (i + 1 ) % CDC_SERIAL_BUFFER_SIZE;
166
+ ringBuffer->buffer [i++] = buffer[k++];
167
+ i %= CDC_SERIAL_BUFFER_SIZE;
168
+ if (i == ringBuffer->tail )
169
+ ringBuffer->full = true ;
169
170
}
171
+ ringBuffer->head = i;
170
172
interrupts ();
171
173
}
172
174
173
175
int Serial_::available (void )
174
176
{
175
177
ring_buffer *buffer = &cdc_rx_buffer;
178
+ if (buffer->full )
179
+ return CDC_SERIAL_BUFFER_SIZE;
176
180
if (buffer->head == buffer->tail ) {
177
181
USB->DEVICE .DeviceEndpoint [2 ].EPINTENSET .reg = USB_DEVICE_EPINTENCLR_TRCPT (1 );
178
182
}
@@ -182,13 +186,9 @@ int Serial_::available(void)
182
186
int Serial_::peek (void )
183
187
{
184
188
ring_buffer *buffer = &cdc_rx_buffer;
185
-
186
- if (buffer->head == buffer->tail )
187
- {
189
+ if (buffer->head == buffer->tail && !buffer->full ) {
188
190
return -1 ;
189
- }
190
- else
191
- {
191
+ } else {
192
192
return buffer->buffer [buffer->tail ];
193
193
}
194
194
}
@@ -203,19 +203,20 @@ int Serial_::read(void)
203
203
ring_buffer *buffer = &cdc_rx_buffer;
204
204
205
205
// if the head isn't ahead of the tail, we don't have any characters
206
- if (buffer->head == buffer->tail )
206
+ if (buffer->head == buffer->tail && !buffer-> full )
207
207
{
208
208
if (usb.available (CDC_ENDPOINT_OUT))
209
209
accept ();
210
210
}
211
- if (buffer->head == buffer->tail )
211
+ if (buffer->head == buffer->tail && !buffer-> full )
212
212
{
213
213
return -1 ;
214
214
}
215
215
else
216
216
{
217
217
unsigned char c = buffer->buffer [buffer->tail ];
218
218
buffer->tail = (uint32_t )(buffer->tail + 1 ) % CDC_SERIAL_BUFFER_SIZE;
219
+ buffer->full = false ;
219
220
// if (usb.available(CDC_ENDPOINT_OUT))
220
221
// accept();
221
222
return c;
0 commit comments