打印
[ARM入门]

USB 丢包

[复制链接]
2836|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leihen0525|  楼主 | 2016-2-23 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟遇到一个问题,就是K60的USB使用块传输的时候发现丢包,上位机用的是开源的libusb,在不懈的调试中发现,上位机不停的读取(大概1MS读取一次),下位机是定时准备数据的(100MS准备一次)
上位机执行读取函数的时候如果下位机数据没有准备好的话,返回超时,如果执行的时候准备好了,就可以读取到,关键来了,如果中间出现过超时,也就是下位机没准备好,上位机读取了,就会出现随机丢包现象,
如果上位机读取时间大一点,也就是保证每次读取的时候 下位机都准备好了,就一直不会出现丢包问题。

这个有点不能理解,难道上下位机还要同步? 这个DATA0\DATA1不就是同步的吗,难道说上位机只要读取一次不管成功还是失败,这个DATA0\DATA1还是会切换?然后下位机的DATA0\DATA1没对上 上位机的 然后数据包就丢弃了?
最后还有一次问题就是 libusb的usb_bulk_read函数,支持可重入吗?如果两个线程同时执行这个函数会不会有风险,好在这个libusb是开源的,实在不行我只能去看源代码了。。。。。。。。

相关帖子

沙发
阿南| | 2016-2-24 09:42 | 只看该作者
建议去深入看下。物理上USB的DATA0\DATA1是一对差分信号

使用特权

评论回复
板凳
xiuwen89| | 2016-2-26 13:19 | 只看该作者
阿南 发表于 2016-2-24 09:42
建议去深入看下。物理上USB的DATA0\DATA1是一对差分信号

差分信号一般是+/-表示,USB的D+ D-,而不是0/1表示。楼主说的DATA0/DATA1,是USB包的ID。和IN/OUT一样,都属于PID (Packet Identifier)。。。

使用特权

评论回复
地板
阿南| | 2016-2-27 09:46 | 只看该作者
xiuwen89 发表于 2016-2-26 13:19
差分信号一般是+/-表示,USB的D+ D-,而不是0/1表示。楼主说的DATA0/DATA1,是USB包的ID。和IN/OUT一样, ...

哦,明白,谢谢

使用特权

评论回复
5
leihen0525|  楼主 | 2016-3-1 12:37 | 只看该作者
这个libusb-win32如果把timeout设置为0就可以收到所有数据不会丢包,但是读取函数会返回-116之类的超时错误(而数据其实已经读取到了),但是多个端点读取如果这个时间设置为0,其他端点就会读取不到,最后查看源码和源码作者的回答时间设置为0是Linux上的,win32上不支持0,唉曲折的很,然后在这一个星期内尝试了windriver,感觉不错毕竟是商业的,可惜几万块的授权,然后又尝试了winusb,又被一个新的问题搞伤掉了,上位机只能运行几次,然后就始终读取失败,下位机复位都不行,必须PC重启,然后又是几次成功,唉,最后又回归到libusbK,libusbK是一个大的集合,看了一下源码确实正规多了,至于之前的问题不知道libusbK会是什么表现,我已经无力再测试了,对于这个问题,我换了个思路,就是在setup包结构中增加了一个类和USB描述符一个级别,用于描述USB所有端点的状态,在下位机要向PC发送数据的时候把这个类的状态更新一下,对于上位机在读取之前用默认端点控制函数获取一下这个类,然后在读取,这样或许就能很好的避免超时等待和丢包问题,唉真心搞伤掉了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

55

帖子

3

粉丝