-                               /* 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(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+                               /* Never send more than one bank size less one byte to the host at a time, so that we don't block
+                                * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */
+                               uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1));
+
+                               /* Read bytes from the USART receive buffer into the USB IN endpoint */
+                               while (BytesToSend--)