你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2023-2-14 14:17
1、问题提出 STM32 开发者在实现 CDC 类虚拟串口与 PC 主机通信过程中,有时会遇到点麻烦而不得其解。那就是当主机端单次发送的数据不超过 64 字节时,接收正常。一旦发送数据量大于 64 字节时就接收失败,总是出现丢包现象,似乎只能接收 64 字节以内的数据。网上有人干脆建议主机每次发送不要超过 64字节,当然,也有人提及要作分包处理但没具体实现代码可以参考。
这个问题在网络上也有些人在试图寻求答案。


`O`E3JD4JOC%@}L4O{$W1.png


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


UOZ2TBVC{%YNUD6MU_W5)_I.png


原理性的东西,这里不多啰嗦了,网上有成堆的介绍资料,在 STMCU 中文网也有很多 USB 的培训资料,需要的可以前往搜索下载。当我们弄清整个原理后,就可以编写接收处理代码了。下面是验证过程。


3、验证测试
下面我利用 HAL 库,基于 STM32F429 芯片演示实现过程,重点在接收处理代码。我使用 STM32F429 Discovery 开发板,使用 HS USB 模块并令其工作在 FS MODE,这样我们就可以方便地使用片内 USB FS PHY。
我使用 STM32CubeMx 工具进行配置,生成基于 STM32 HAL 库的工程。使用 ST 提供的 STM32CubeIDE进行编译调试。有关配置就不截图了。
另外,我还配置了 1 个按键并开启相应外部中断。每发生按键事件时,F429 USB 设备向 PC 主机发送一段打招呼的字符串,并通过串口助手显示出来。
我在 main.c 文件里定义了下面几个变量:


EGYNJ`]YJB24PNF8H$TN5@Y.png


其中,Flag_KeyPressed 和 Flag_DataReceived 分别标示按键操作和收到从主机发过来的数据的情况。Rx_buffer【】数组用来存放接收来自主机的数据,我这里的定义长度为 512 字节【具体使用时按需设置】。下图是 Main.c 里的主循环代码截图,见图 4。


%HG3]6$G@7_0_Z)Z_A[QB1J.png


主循环里检查按键标志和收到数据的标志,如有按键发生,则向主机发送前面提到的打招呼的字符串;如有收到来自主机的数据,则向主机回送过去。
今天的重点是讨论 USB 设备如何从主机接收 64 字节以上的数据。基于现有 HAL 库,对于 USB 设备的接收,我们只需关注一个 USB 中断接收回调函数,那就是 CDC_Receive_HS()函数。该函数在usbd_cdc_if.c 文件里。我具体编写的函数代码如下面两幅截图所示。



完整版请查看:附件 如何让CDC类USB设备批量接收64字节以上数据_v1.0.pdf (741.96 KB, 下载次数: 44)
收藏 评论1 发布时间:2023-2-14 14:17

举报

1个回答
Esbin 回答时间:2023-2-27 22:16:25

感谢分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版