diff --git a/stmhal/usbd_cdc_interface.c b/stmhal/usbd_cdc_interface.c index 81f541df43..c6b6cf23f6 100644 --- a/stmhal/usbd_cdc_interface.c +++ b/stmhal/usbd_cdc_interface.c @@ -60,7 +60,7 @@ static uint16_t UserRxBufLen = 0; // counts number of valid characters in UserRx static uint8_t UserTxBuffer[APP_TX_DATA_SIZE]; // data for USB IN endpoind is stored in this buffer static uint16_t UserTxBufPtrIn = 0; // increment this pointer modulo APP_TX_DATA_SIZE when new data is available -static uint16_t UserTxBufPtrOut = 0; // increment this pointer modulo APP_TX_DATA_SIZE when data is drained +static __IO uint16_t UserTxBufPtrOut = 0; // increment this pointer modulo APP_TX_DATA_SIZE when data is drained static int user_interrupt_char = VCP_CHAR_NONE; static void *user_interrupt_data = NULL; @@ -265,6 +265,14 @@ void USBD_CDC_HAL_TIM_PeriodElapsedCallback(void) { } buffptr = UserTxBufPtrOut; + + // dpgeorge: For some reason that I don't understand, a packet size of 64 bytes + // (CDC_DATA_FS_MAX_PACKET_SIZE) does not get through to the USB host until the + // next packet is sent. To work around this, we just make sure that we never + // send a packet 64 bytes in length. + if (buffsize == CDC_DATA_FS_MAX_PACKET_SIZE) { + buffsize -= 1; + } USBD_CDC_SetTxBuffer(&hUSBDDevice, (uint8_t*)&UserTxBuffer[buffptr], buffsize);