@@ -102,6 +102,7 @@ __IO uint32_t lineState = 0;
102
102
volatile uint32_t USB_received = 0 ;
103
103
uint8_t USBBuffer [64 ];
104
104
uint8_t USBPackSize ;
105
+ bool sendZLP = false;
105
106
106
107
/* Default configuration: 115200, 8N1 */
107
108
uint8_t lineSetup [] = {0x00 , 0xc2 , 0x01 , 0x00 , 0x00 , 0x00 , 0x08 };
@@ -362,6 +363,7 @@ void TIM6_PeriodElapsedCallback(stimer_t *htim)
362
363
{
363
364
UNUSED (htim );
364
365
uint8_t status ;
366
+ uint16_t transferSize ;
365
367
366
368
if (USB_received ) {
367
369
USB_received = 0 ;
@@ -379,30 +381,39 @@ void TIM6_PeriodElapsedCallback(stimer_t *htim)
379
381
380
382
USBD_CDC_ReceivePacket (& hUSBD_Device_CDC );
381
383
}
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
+ }
382
405
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 );
395
412
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 ;
402
415
403
- if (status == USBD_OK ) {
404
- UserTxBufPtrOut = UserTxBufPtrIn ;
405
- }
416
+ sendZLP = transferSize %64 == 0 ;
406
417
}
407
418
}
408
419
0 commit comments