请教一个CDC例程中0len packet问题

在例程中\CH32V307EVT\EVT\EXAM\USB\USBHS\DEVICE\SimulateCDC\User\UART

下面对发送pack0加了一个条件判断,需要等60mS??( DEF_UARTx_RX_TIMEOUT * 20 )才发送。

请问为什么要等2mS。不可以在( Uart.USB_Up_IngFlag == 0 )后立即发送吗?


? ? /* Determine if a 0-length packet needs to be uploaded (required for CDC mode) */

? ? if( Uart.USB_Up_Pack0_Flag )

? ? {

? ? ? ? if( Uart.USB_Up_IngFlag == 0 )

? ? ? ? {

? ? ? ? ? ? if( Uart.USB_Up_TimeOut >= ( DEF_UARTx_RX_TIMEOUT * 20 ) )

? ? ? ? ? ? {


另外,为什么发送后立即设置Uart.USB_Up_IngFlag = 0; ?不应该等应答后在USBHS_IRQHandler( void )中清零吗?


      您好,程序中此部分对发送pack0加了一个超时判断,是用来判断是否需要上传一个0长度的数据包;

      对于批量传输,如果最后一个IN事务数据长度小于端点支持的最大包长度,主机就认为数据已经上传完成,如果最后一个IN事务数据长度等于端点支持的最大包长度,则需要额外上传一个0长度的数据包告诉主机数据上传结束了;

      因此在数据上传时如果数据长度等于端点最大包长度,会将USB_Up_Pack0_Flag标志置位,但不是USB_Up_Pack0_Flag为1就一定需要上传额外的0长度数据包,有可能后面还有数据要上传;所以增加超时判断确认数据上传结束了,确实是需要额外上传一个0长度的数据包;

image.png

      然后就会执行下面这一部分来额外上传一个0长度的数据包,由于主机并不会对此数据包做做响应,所以在发送结束后

立即设置Uart.USB_Up_IngFlag = 0;

image.png



谢谢解答!


只有登录才能回复,可以选择微信账号登录