Avoid serial buffer overrun on leonardo
This commit is contained in:
parent
5ca747e312
commit
dc86d26a11
|
@ -141,16 +141,22 @@ void Serial_::end(void)
|
|||
void Serial_::accept(void)
|
||||
{
|
||||
ring_buffer *buffer = &cdc_rx_buffer;
|
||||
int c = USB_Recv(CDC_RX);
|
||||
int i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE;
|
||||
|
||||
// if we should be storing the received character into the location
|
||||
// just before the tail (meaning that the head would advance to the
|
||||
// current location of the tail), we're about to overflow the buffer
|
||||
// and so we don't write the character or advance the head.
|
||||
if (i != buffer->tail) {
|
||||
|
||||
// while we have room to store a byte
|
||||
while (i != buffer->tail) {
|
||||
int c = USB_Recv(CDC_RX);
|
||||
if (c == -1)
|
||||
break; // no more data
|
||||
buffer->buffer[buffer->head] = c;
|
||||
buffer->head = i;
|
||||
|
||||
i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -603,7 +603,7 @@ ISR(USB_GEN_vect)
|
|||
{
|
||||
#ifdef CDC_ENABLED
|
||||
USB_Flush(CDC_TX); // Send a tx frame if found
|
||||
while (USB_Available(CDC_RX)) // Handle received bytes (if any)
|
||||
if (USB_Available(CDC_RX)) // Handle received bytes (if any)
|
||||
Serial.accept();
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue