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

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

[复制链接]
STMCU小助手 发布时间:2023-2-14 14:17
1、问题提出 STM32 开发者在实现 CDC 类虚拟串口与 PC 主机通信过程中,有时会遇到点麻烦而不得其解。那就是当主机端单次发送的数据不超过 64 字节时,接收正常。一旦发送数据量大于 64 字节时就接收失败,总是出现丢包现象,似乎只能接收 64 字节以内的数据。网上有人干脆建议主机每次发送不要超过 64字节,当然,也有人提及要作分包处理但没具体实现代码可以参考。  w/ [7 R: z- H
这个问题在网络上也有些人在试图寻求答案。
) g# p6 S$ L' W, F  {
" q, [$ N  h) J; \" b- s
  O6 z% H1 K2 D" h% G# C* S
`O`E3JD4JOC%@}L4O{$W1.png 0 c, y* Q2 l7 J; h9 |9 K9 W# A8 p. E9 B
# e" `# z0 h. y$ S0 L

, U, ^8 M- Z2 G: S/ `. n2、解决思路及原理 & f" S; a5 s  p6 i/ H$ f% Z
作为 CDC 类的 USB 设备,到底能不能正确接收来自主机 64 字节以上的批量数据呢?3 d4 u) b- ^7 v- B
其实是可以的,只是当我们一次传输的数据大于当前端点所支持的最大包长时【这里端点使用 BULK 传输,最大包长默认设置为 64 字节】,USB 模块会做分包传输,将一批数据传输分成多个处理[或称事务],即多个 transaction 来完成,每个 Transaction 里的数据包传输的最大数据量为 64 字节。
6 a7 r: K2 K$ k
, V1 n( O' _$ Q+ S, `
$ {+ `4 Q9 x) C2 x& k9 r
UOZ2TBVC{%YNUD6MU_W5)_I.png
( @$ R" ~' t. g! i0 K% M' m) ?/ j2 T1 L
2 b1 F- t3 t! E4 C0 u9 g

. A6 W' _. O2 u/ u: ]. ^原理性的东西,这里不多啰嗦了,网上有成堆的介绍资料,在 STMCU 中文网也有很多 USB 的培训资料,需要的可以前往搜索下载。当我们弄清整个原理后,就可以编写接收处理代码了。下面是验证过程。
* U0 T- C$ P8 ]
  F# z0 y+ Z$ \8 u, G
( V1 j& O5 G4 Q, c3 @
3、验证测试 $ ]5 r% T/ e( H. r; f; s
下面我利用 HAL 库,基于 STM32F429 芯片演示实现过程,重点在接收处理代码。我使用 STM32F429 Discovery 开发板,使用 HS USB 模块并令其工作在 FS MODE,这样我们就可以方便地使用片内 USB FS PHY。9 N1 p9 E+ q- s9 x  @% O
我使用 STM32CubeMx 工具进行配置,生成基于 STM32 HAL 库的工程。使用 ST 提供的 STM32CubeIDE进行编译调试。有关配置就不截图了。
3 u3 R% U! W) c1 `; H另外,我还配置了 1 个按键并开启相应外部中断。每发生按键事件时,F429 USB 设备向 PC 主机发送一段打招呼的字符串,并通过串口助手显示出来。
8 f/ D: ^: N* B; _$ ?. _我在 main.c 文件里定义了下面几个变量:
2 g% _0 y6 b0 F. p( b- I1 Y  |* n' M  m' U0 u( _

8 s. T9 V* u8 i EGYNJ`]YJB24PNF8H$TN5@Y.png
: T- h/ y+ y2 j, w  X( p  b+ t: \: D

& F6 Q8 t+ f3 N0 z& S. S# h# D其中,Flag_KeyPressed 和 Flag_DataReceived 分别标示按键操作和收到从主机发过来的数据的情况。Rx_buffer【】数组用来存放接收来自主机的数据,我这里的定义长度为 512 字节【具体使用时按需设置】。下图是 Main.c 里的主循环代码截图,见图 4。
! W( n% ?# f1 @: \- C$ [: F2 p
$ S$ ?  L+ W  h& e

* y9 Q/ j; b) A %HG3]6$G@7_0_Z)Z_A[QB1J.png 7 D# L& r2 Z9 a* I* G( m
  d7 R6 j( z$ T/ b8 r# w! a9 L
5 |- N9 g4 }% C, P9 W
主循环里检查按键标志和收到数据的标志,如有按键发生,则向主机发送前面提到的打招呼的字符串;如有收到来自主机的数据,则向主机回送过去。
& j) B% }) R2 p2 Y& d9 ]今天的重点是讨论 USB 设备如何从主机接收 64 字节以上的数据。基于现有 HAL 库,对于 USB 设备的接收,我们只需关注一个 USB 中断接收回调函数,那就是 CDC_Receive_HS()函数。该函数在usbd_cdc_if.c 文件里。我具体编写的函数代码如下面两幅截图所示。$ I; d5 V# w) B8 b/ p, {
: V( u) A- b7 q! M: u
3 ^1 r- t6 i: O( E* L

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

举报

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

感谢分享

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版