CH32V307 USB HS模式 BULK传输 几个小时内数据有丢失

使用 Ch32v307RCT6模块 的ADC进行电压采样, 使用HS模式的USB接口传输采样的数据给PC,  需求是: 实时传输, 不能丢失数据, PC端需要每一个采样值.


PC端 使用BULK传输 读取数据, 30ms传输一次, 一次传输的数据量是25k字节, 这些数据封装成一个数据包, 有固定的头, 带有递增的ID, 对数据也加了CRC校验, 通过USB分包传输.

现象: 几个小时内 必定有几帧丢失


这可能是什么原因呢? 


网上关于BULK传输, "Bulk 传输是一种不可靠的传输方式,数据包的传输可能会出现错误或丢失。因此,在进行 Bulk 传输时,需要在应用程序中实现重传机制,以确保数据的可靠传输。"

不是很确定, 是否是这个原因? 请帮忙 分析下问题, 多谢~

f296e5d22518350a4f45f0643ae4fdf.png

你好,bulk传输是可靠的,有校验和重传,可以用bushound或硬件抓包工具,查看实际上传的数据。下位机软件要用端点的busy标志位判断上次数据是否发送完成,防止把上次数据覆盖。如果有变量在中断和主函数中都用到,参考CDC例程中的做法,需要在主函数中操作变量前,关闭中断,赋值完再打开中断。


使用了 CherryUSB/cherryusb_wch: CherryUSB Demo for WCH (github.com) 这个库.

busy的标志位是有的, 同时也加上了超时处理,

一次完整的数据传输是:

主循环, 等到ADC Half中断完成后, 开始通过USB发送ADC的Half数据,


先传输28个字节的Header包, 2毫秒超时, 再传输25k字节, 20毫秒超时.


超过最大包长度会自动分包, 分包是在USB 中断处理函数中.


时间方面, 一次完整数据通过USB传输, 需要约1.2ms, ADC采样的中断触发周期约30ms, PC端解析约 0.4~1.2ms, 时间上也都很宽松

抓包的话, 估计太复杂了, 数据量比较大


已搞定, 买了USB协议分析仪后, 发现数据没有丢失, 问题是 我底层代码传输的问题. CH32V307确实可以!

想请教下, PC上 Host端 使用libusb循环 接收 20*1024字节数据, 那么Device端 是否必须 一次Transfer传输完 20*1024个字节的数据? 如果进行2次Transfer, 1次Transfer是 2*1024个字节, 另1次Transfer是18*1024个字节, 这样PC端 若不额外处理, 是不是就会出问题?


没有写过USB的上位机软件,正常来说,电脑下发IN包,设备回复数据或是NAK,bulk每包最大512字节。电脑接受20K数据的过程中,可以有NAK的包,也就是说可以间断。MCU角度并没有问题,电脑角度,可能需要注意API的超时时间。


请问一下这个问题你们解决了吗?最后找到是什么问题了吗?


只有登录才能回复,可以选择微信账号登录