问题标题:i.MX RT1052 SDK2.3 USB_device_cdc_vcom例子数据不能一直接收?
问题详情:i.MX RT1052usb_device_cdc_vcom例子里的APPTask函数里如果usb接收到一次数据,然后不发送数据回去,那么后面就接收不到数据了,串口助手直接就卡死,这可能就是bug。下图是根据官方代码改写为的内容,屏蔽掉 APPTask里面的代码,就会出现问题。 问题解决: 发现在USB_DeviceCdcVcomCallback event=kUSB_DeviceCdcEventSendResponse的时候,有个:
- /* User: addyour own code for send complete event */
- /* Schedulebuffer for next receive event */
- error =USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_currRecvBuf,
- g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize);
复制代码
用于准备下次接收的代码。
所以你可以把你APPTask里面,接收到数据之后,加一个准备下次接收的代码,如下: - <div align="left"><div align="left"> if ((0 != s_recvSize) &&(USB_CANCELLED_TRANSFER_LENGTH != s_recvSize))</div><div align="left"> {</div><div align="left"> int32_t i;</div><div align="left"> /* Copy Buffer to Send Buff */</div><div align="left"> for (i = 0; i < s_recvSize; i++)</div><div align="left"> {</div><div align="left"> s_currSendBuf[s_sendSize++] =s_currRecvBuf;</div><div align="left"> }</div><div align="left"> s_recvSize = 0;</div><div align="left"> s_sendSize = 0;//kerryadd</p><p><em>//Kerry add, used for Schedule buffer for nextreceive event</em></div><div align="left"> error =USB_DeviceCdcAcmRecv(s_cdcVcom.cdcAcmHandle, USB_CDC_VCOM_BULK_OUT_ENDPOINT,</div><div align="left">s_currRecvBuf, g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize);}</div></div>
复制代码其实这个还是和用户实际的代码功能设计有关,官方代码只是给了一个参考。
|