[STM32F7] CubeMX USB CDC 全双工通信

[复制链接]
258|42
juliestephen 发表于 2026-9-19 14:40 | 显示全部楼层
只是将主循环的处理逻辑放到一个独立的USB发送任务中,通过队列来传递数据即可。
robertesth 发表于 2026-9-20 11:04 | 显示全部楼层
用 DMA 搬数据、还没搬完就提前退出并重新使能接收,新数据会覆盖还没处理完的缓冲区。
claretttt 发表于 2026-9-20 11:54 | 显示全部楼层
发送数据包时如何避免缓冲区冲突?
i1mcu 发表于 2026-9-20 17:31 | 显示全部楼层
如果主机持续发送数据,会导致主机端超时或数据丢失。
jimmhu 发表于 2026-9-20 19:11 | 显示全部楼层
CDC_Transmit_FS 有忙标志保护,第二次调用会被直接丢弃
minzisc 发表于 2026-9-20 19:38 | 显示全部楼层
在 CDC_Receive_FS 函数执行期间,USB设备端的OUT端点会被硬件NAK,暂时无法接收新的数据包。
mmbs 发表于 2026-9-20 21:53 | 显示全部楼层
这不是"函数阻塞等待",而是"让主机暂时发不进来"
lzmm 发表于 2026-9-21 08:40 | 显示全部楼层

如何分离收发逻辑提升系统稳定性?
闪烁阴影 发表于 2026-9-21 09:08 | 显示全部楼层
你说的对,CDC_Receive_FS 中不能连续发送多个数据包,否则会阻塞接收。我之前项目中遇到过类似问题,改为主循环发送数据,效果不错。
sdlls 发表于 2026-9-21 11:48 | 显示全部楼层
USB CDC多线程数据处理最佳实践?
pentruman 发表于 2026-9-21 13:14 | 显示全部楼层
能不能在 CDC_Receive_FS 里发送多个数据包?
香水城 发表于 2026-9-21 15:26 | 显示全部楼层
本帖最后由 香水城 于 2026-9-28 10:50 编辑

在 USB CDC 的 OUT 接收回调中发起 IN 方向发送,从端点方向机制上是可行的;

但还是希望应该让这个回调函数尽量保持短小,做轻量、少量的响应发送,不适合在其中等待发送

完成或执行多次长时间发送,否则会拉长回调占用时间,影响整个 USB 通讯的实时性与稳定性。
pmp 发表于 2026-9-21 16:09 | 显示全部楼层
USB CDC 的底层驱动通常使用一个状态标志位来管理发送忙闲。
cashrwood 发表于 2026-9-21 17:00 | 显示全部楼层
CDC_Receive_FS 是一个‌回调函数‌,它运行在 USB 中断服务程序或高优先级的任务上下文中。
qiufengsd 发表于 2026-9-21 17:45 | 显示全部楼层
这个函数的阻塞特性具体指什么?              
mnynt121 发表于 2026-9-21 21:03 | 显示全部楼层
为什么不能在里面发送多个数据包?
lzbf 发表于 2026-9-21 21:48 | 显示全部楼层
CDC_Receive_FS是接收函数,非发送函数,其"阻塞"特性指需及时处理接收数据,而非禁止发送
1988020566 发表于 2026-9-23 10:16 | 显示全部楼层
CDC_Receive_FS 里只做"快进快出"的搬运,把发送交给主循环或发送完成回调去驱动。
macpherson 发表于 2026-9-23 12:01 | 显示全部楼层
应该通过一个队列或环形缓冲区,传递到主循环或一个专门的任务中去发送。
uiint 发表于 2026-9-23 12:58 | 显示全部楼层
CDC_Receive_FS 里只做"复制数据 + 重启接收"两件事,耗时控制在 10μs 以内,所有发送操作放到主循环或发送完成回调中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部