打印

中断传输是否不保证PC机程序能够接受到?

[复制链接]
1445|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
airscrap|  楼主 | 2013-3-7 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断传输是由上位机在某一时间间隔内不断地发起传输,
比如设备接收到中断 EP1 IN, 这时候设备的数据如果已经准备好了,就会把数据传回上位机。
然后,设备马上又会收到下一个EP1 IN中断,又可以传输下一包数据了。
如果设备一直有新的数据,它可以一直往上位机发送。

问题是,我是想用一个上位机的软件接收这些数据的。可是这个上位机软件却没办法指定usb设备什么时候往上发数据。那设备发送的数据岂不是都被丢掉了?

相关帖子

沙发
airscrap|  楼主 | 2013-3-8 18:03 | 只看该作者
好吧,我再把问题讲详细一些:

我按照《圈圈教你玩usb》第5章的方法做了一个自定义的HID
设备上按键,PC端的界面有显示键被按下。这是用中断传输实现的。

我把程序改成始终都有键按下(或抬起),使得设备端不断地SendReport上去。每秒钟可以SendReport的次数为400K。

但上位机使用ReadFile接受数据,流程大概是:
while(1)
{
        ResetEvent
        ReadFile
        WaitForSingleObject
        GetOverlappedResult
}
这个循环运行的很慢,大概每秒钟运行100次。大部分的report都被丢掉了。

请问如何处理这个问题?还是说中断传输就是这样的?

使用特权

评论回复
板凳
john_lee| | 2013-3-8 18:49 | 只看该作者
把 ReadFile 的读缓冲设大一些,可以一次多读几个 report,缓冲区长度必须是 report 长度 + 1 的倍数,否则 ReadFile 会返回参数错误。
如果还不行,可以使用 HidD_SetNumInputBuffers  把 hid 的驱动 buffer 改大一些,xp 上默认是 32 个 report。

使用特权

评论回复
地板
dqyubsh| | 2013-3-8 18:50 | 只看该作者
中断传输当然是可以丢掉数据的,这是USB协议规定的,跟你自己如何如何没有任何关系。

使用特权

评论回复
5
dqyubsh| | 2013-3-8 21:35 | 只看该作者
我想了一下,中断传输是会出错的,大致下次会重发。不过主机如果响应不了,还是会丢的。无错传输就用BULK,而且大量数据通讯时只能是BULK。如果数据包很短,而且不定时,可以用控制传输,它也是无错的。中断传输和同步传输都不适合无错通讯,数据包太短,对定时要求太高,主机软件可能响应不了。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝