• 资料介绍
    • 问题提出
    • 解决思路及原理
    • 验证测试
    • 小结
  • 资料预览
  • 相关推荐
申请入驻 产业图谱

LAT1242 如何让CDC类USB设备批量接收64字节以上数据

03/25 14:15
356
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

LAT1242 如何让CDC类USB设备批量接收64字节以上数据

741.96 KB

问题提出

STM32 开发者在实现 CDC 类虚拟串口与 PC 主机通信过程中,有时会遇到点麻烦而不得其解。那就是当主机端单次发送的数据不超过 64 字节时,接收正常。一旦发送数据量大于 64 字节时就接收失败,总是出现丢包现象,似乎只能接收 64 字节以内的数据。网上有人干脆建议主机每次发送不要超过 64字节,当然,也有人提及要作分包处理但没具体实现代码可以参考。

解决思路及原理

作为 CDC 类的 USB 设备,到底能不能正确接收来自主机 64 字节以上的批量数据呢?其实是可以的,只是当我们一次传输的数据大于当前端点所支持的最大包长时【这里端点使用 BULK 传输,最大包长默认设置为 64 字节】,USB 模块会做分包传输,将一批数据传输分成多个处理[或称事务],即多个 transaction 来完成,每个 Transaction 里的数据包传输的最大数据量为 64 字节。

验证测试

下面我利用 HAL 库,基于 STM32F429 芯片演示实现过程,重点在接收处理代码。我使用 STM32F429Discovery 开发板,使用 HS USB 模块并令其工作在 FS MODE,这样我们就可以方便地使用片内 USB FSPHY。

我使用 STM32CubeMx 工具进行配置,生成基于 STM32 HAL 库的工程。使用 ST 提供的 STM32CubeIDE进行编译调试。有关配置就不截图了。

另外,我还配置了 1 个按键并开启相应外部中断。每发生按键事件时,F429 USB 设备向 PC 主机发送一段打招呼的字符串,并通过串口助手显示出来。

小结

其实,我上面分享的接收处理代码也有很好的通用性,并不局限于 Bulk 传输端点。我们知道,不同传输类型的端点的最大包长往往并不一样,如果使用上面的参考代码,我们只需调整那个最大包长参数【Max_Pack_Size】,并根据应用适当调整 Rx_buffer[]数组的大小就可以使用了。数据个数、传输包个数这些变量定义及使用都可以保留参考。

资料预览

点赞
收藏
评论
分享
加入交流群
举报

相关推荐

方案定制

去合作
方案开发定制化,2000+方案商即时响应!