-       /* Read bytes from the USB OUT endpoint into the UART transmit buffer */
-       if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface))
-         RingBuffer_Insert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
-       
-       /* Read bytes from the UART receive buffer into the USB IN endpoint */
-       if (UARTtoUSB_Buffer.Count)
-         CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
+       /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */
+       if (!(RingBuffer_IsFull(&USBtoUART_Buffer)))
+       {
+               int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
+
+               /* Read bytes from the USB OUT endpoint into the UART transmit buffer */
+               if (!(ReceivedByte < 0))
+                 RingBuffer_Insert(&USBtoUART_Buffer, ReceivedByte);
+       }
+
+       /* Check if the UART receive buffer flush timer has expired or buffer is nearly full */
+       uint16_t BufferCount = RingBuffer_GetCount(&UARTtoUSB_Buffer);
+       if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200))
+       {
+               /* Clear flush timer expiry flag */
+               TIFR0 |= (1 << TOV0);
+
+               /* Read bytes from the USART receive buffer into the USB IN endpoint */
+               while (BufferCount--)
+               {
+                       /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+                       if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+                                                                       RingBuffer_Peek(&UARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+                       {
+                               break;
+                       }
+
+                       /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+                       RingBuffer_Remove(&UARTtoUSB_Buffer);
+               }
+       }