USB CDC Bulk IN 端点冻结

Posted

技术标签:

【中文标题】USB CDC Bulk IN 端点冻结【英文标题】:USB CDC Bulk IN Endpoint Freeze 【发布时间】:2017-05-02 21:49:19 【问题描述】:

我正在使用 LPC2368 通过 USB CDC 与 PC 进行通信。 当 PC 通过 Bulk Out Endpoint 2 向 LPC 发送命令时,LPC2368 从 UART 接收 4104 个字节,通过 USB CDC Bulk IN Endpoint 2 发送到 PC。

在 PC 上,这些数据被认为是来自虚拟 COM 端口,使我能够通过超级终端查看数据(发送到 PC)。

有些命令的响应小于 64 字节。

发送命令获取这4104字节后,4014字节从UART成功接收,并在for循环中发送(批量传输一次只能发送64字节)到PC。

现在,如果在收到 4104 字节后发送任何命令,则看不到响应。只有在发送两次命令后,我才得到响应。

谁能指导解决USB的这种行为?

【问题讨论】:

【参考方案1】:

对于批量传输,一次只能发送 64 个字节

是的,如果您的最后一笔交易正好 64 字节长,连接将“挂起”。原因是批量管道鲜为人知的特性,它将背靠背的 64 字节(最大数据包大小)事务视为单个更大的事务。任何小于最大数据包大小的数据包都将完成一个事务。

解决方法很简单:如果在 64 字节数据包之后没有更多字节要传输,则只需传输 零数据包。是的,这是一个不包含数据字节的数据包。

大多数 USB2UART 示例代码没有实现此修复,因为 UART 通常不够快,无法将 fifo 首先填充到 64 字节。

【讨论】:

感谢您的回答。我正在休假,所以无法立即返回。 任何小于最大数据包大小的数据包都将完成一个事务。 所以,是的,我在循环中发送 64 个数据包,64 次加上最后一个数据包中的最后 8 个字节。 只需发送一个零数据包。是的,这是一个不包含数据字节的数据包。这意味着, USB_WriteEP (0x82, (unsigned char *)&Buffer[0], 0 ); ;对吗? 我尝试了零长度数据包仍然没有响应,直到命令发送两次。 “原因是批量管道鲜为人知的特性,它将背靠背的 64 字节(最大数据包大小)事务视为单个更大的事务。”这部分我没看懂。是否符合 USB 规范?根据 USB 规范,它是一个散装管道功能吗?如果您参考了有关此限制的规范,请告诉我。 它在 USB 规范中,参见 USB 2.0 规范中的第 5.8.3 章。 规范说,当传输确切的数据量时,它也结束了。或者更小的数据包也将结束传输。根据 OP,8 字节是最后一个数据包大小。那应该已经完成​​了转移。但它仍然挂起。你认为那里发生了什么?我相信这也取决于设备。某些设备强制发送零长度数据包以结束传输

以上是关于USB CDC Bulk IN 端点冻结的主要内容,如果未能解决你的问题,请参考以下文章

STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。

用于传输数据的 USB DUAL CDC 端点

linux提示usb_serial_generic_write_bulk_callback - urb stoped: -32

USB应用实战视频教程第3期:手把手玩转USB BULK方式下位机和QT6.4上位机开发(上篇)

ES 批量操作bulk

FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 如何指向引发异常的集合元素?