Skip to content

Commit a007e0a

Browse files
committed
Added Zero Length Package after transmitting full buffer
1 parent ce09a37 commit a007e0a

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

libraries/USBSerial/src/usbd_cdc_if.c

+32-21
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ __IO uint32_t lineState = 0;
102102
volatile uint32_t USB_received = 0;
103103
uint8_t USBBuffer[64];
104104
uint8_t USBPackSize;
105+
bool sendZLP = false;
105106

106107
/* Default configuration: 115200, 8N1 */
107108
uint8_t lineSetup[] = {0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x08};
@@ -362,6 +363,7 @@ void TIM6_PeriodElapsedCallback(stimer_t *htim)
362363
{
363364
UNUSED(htim);
364365
uint8_t status;
366+
uint16_t transferSize;
365367

366368
if(USB_received) {
367369
USB_received = 0;
@@ -379,30 +381,39 @@ void TIM6_PeriodElapsedCallback(stimer_t *htim)
379381

380382
USBD_CDC_ReceivePacket(&hUSBD_Device_CDC);
381383
}
384+
385+
if(UserTxBufPtrOut > UserTxBufPtrIn) { /* Roll-back */
386+
memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut));
387+
memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn);
388+
389+
transferSize = (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn);
390+
391+
USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&StackTxBufferFS[0], transferSize);
392+
}
393+
else if (UserTxBufPtrOut != UserTxBufPtrIn) {
394+
transferSize = (UserTxBufPtrIn - UserTxBufPtrOut);
395+
396+
USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], transferSize);
397+
}
398+
else if (sendZLP) {
399+
transferSize = 0;
400+
401+
USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, NULL, 0);
402+
} else {
403+
return;
404+
}
382405

383-
if(UserTxBufPtrOut != UserTxBufPtrIn) {
384-
if(UserTxBufPtrOut > UserTxBufPtrIn) { /* Roll-back */
385-
memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut));
386-
387-
memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn);
388-
389-
USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&StackTxBufferFS[0], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn));
390-
}
391-
else
392-
{
393-
USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (UserTxBufPtrIn - UserTxBufPtrOut));
394-
}
406+
do {
407+
if (lineState == 0) // Device disconnected
408+
status = USBD_OK;
409+
else
410+
status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC);
411+
} while(status == USBD_BUSY);
395412

396-
do {
397-
if (lineState == 0) // Device disconnected
398-
status = USBD_OK;
399-
else
400-
status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC);
401-
} while(status == USBD_BUSY);
413+
if(status == USBD_OK) {
414+
UserTxBufPtrOut = UserTxBufPtrIn;
402415

403-
if(status == USBD_OK) {
404-
UserTxBufPtrOut = UserTxBufPtrIn;
405-
}
416+
sendZLP = transferSize%64 == 0;
406417
}
407418
}
408419

0 commit comments

Comments
 (0)