求:ReadFile与HID compliant device(自定义HID的设备驱动)通讯时有时超时的原因?

sxslyy 2014-01-10 11:51:26
我碰到的情况是这样的!

用VC Readfile 异步方式去读取一个自定义HID设备(HID设备使用的是Windows自带的驱动 即 HID compliant device设备驱动)上传上来的数据。

因为“HID compliant device设备驱动”是挂在"USB人体输入学设备驱动程序"之上,USB人体输入学设备驱动会向定时向 HID设备请求数据 收到的数据存到一个缓存区里。

使用BUS HOUND抓包情况可以看到USB人体输入学设备驱动的数据:

24 DI 01 01 43ms USB人体输入学设备驱动

然后当上位机应用程序使用Readfile读取这个数据的时候,Readfile会发出一个Windows IO请求,Windows IO请求 调用 “HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据。

因为我的设备不同报告ID及数据有多个,最长的是一个对应的数据是 6位 所以

使用BUS HOUND抓包情况可以看到HID compliant device设备驱动的数据:

23.1 DI 01 01 00 00 00 00 00 10ms HID compliant device驱动

看似“HID compliant device设备驱动”已请求到了“USB人体输入学设备驱动”的取得的数据。但这时问题出现了!

Readfile 异步读取,等时设置为6000ms ,经N次这样的读取时,偶尔会出现一次读超时(大部分时间是读是正确的)。

从数据跟踪上看!BUS HOUND 已经可以看到HID compliant device设备驱动的数据。数据无论是长度还是内容也都是正确的!为什么Readfile 会在指定的时间内读不到呢!会是什么原因引起的。

特别指出的是!经过测试!在Readfile前加Sleep(*)延时时间越长,这种读超时的情况出现的就越少。不加Sleep(*)延时,读超时的情况就会出现的越多。几百次正确读取后,可能就会出现一次读超时。

感觉上象“USB人体输入学设备驱动”的取得HID设备的上传数据后,越慢使用Readfile调用 “HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据(即延时时间越长),出现Readfile读超时的情况就越小。

我就想高人帮我分析一下,出现这咱情况的原因及原理。特别是这种情况下设备驱动可能的是什么工作状态才引发了这种情况。
如:
可能是 Readfile会发出的Windows IO请求 被别的请求长时间挂起了吗?
可能是“HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据时,在总线传输出错了吗?
可能是“HID compliant device设备驱动”读数据放到它自身的数据缓存中出错了吗?
可能是“HID compliant device设备驱动”自身的数据缓存不可用吗?
等等可能的原因。

注:握手重发的机制我的程序都有!程序可以正常通讯工作!我主要是想请理解类似驱动原理的高手指点一下出现这种情况的原因及有没有办法可以提前检测这种情况。

敬上!



...全文
6169 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
大漠鸿图 2016-03-17
  • 打赏
  • 举报
回复
楼主,我也遇到相同的问题,能不能分享一下解决方法啊??
天际抓根宝 2015-04-20
  • 打赏
  • 举报
回复
我也遇到相同的问题,楼主解决了吗?
笨笨仔 2014-11-28
  • 打赏
  • 举报
回复
引用 9 楼 sxslyy 的回复:
自己顶一下!我就是想知道为什么会出现这种情况!问题会出在哪里
程序中未建立读事件吗?收到事件再读啊。
liang2769705 2014-11-28
  • 打赏
  • 举报
回复
楼主 ,不知道你的问题解决了没,我现在也碰到类似的问题,对下位机发个查询命令下去,半天才给我回信息,甚至根本没有信息,搞不懂是下位机的问题还是什么设置没做好。楼主如果做好了,能否分享点经验给我 谢谢了
Yofoo 2014-09-05
  • 打赏
  • 举报
回复
是不是硬件有问题, 迟迟没发数据
冰V澈 2014-09-04
  • 打赏
  • 举报
回复
我先在是直接全部接收不到,上层发给下层是成功的,下层也发出来了,包夜抓到了,但就是死活收不到,楼主帮忙解答一下呗
sxslyy 2014-02-17
  • 打赏
  • 举报
回复
自己顶一下!我就是想知道为什么会出现这种情况!问题会出在哪里
天冰天降 2014-01-13
  • 打赏
  • 举报
回复
所有的设备通讯都有可能出现问题,丢了就丢了,超时后再发
sxslyy 2014-01-13
  • 打赏
  • 举报
回复
vipcxj:这条数据是如何及所种原因被滤掉了呢! 23.1 DI 01 01 00 00 00 00 00 10ms HID compliant device驱动 BUS HOUND 都能截获这包数据,BUS HOUND 其本质也是一个过滤驱动程序!同一条数据,为什么它成功了!HID compliant device驱动 失败了呢! w110223:本贴意在!请教明白这块驱动机制的达人细一点的讲述一下,HID compliant device设备驱动向”USB人体输入学设备“请求数据 及和Readfile交互的细节!因为关于这块的资料很少有描述的!至于通讯出错,丢了再发,这类的处理手段!大家一般都能处理好的!
vipcxj 2014-01-12
  • 打赏
  • 举报
回复
因为你的数据不能正好塞满一个buff,某条数据就塞了一半,导致这条数据就没了?猜的
sxslyy 2014-01-12
  • 打赏
  • 举报
回复
看过一个文章“Windows主机端与自定义USB HID设备通信详解",有这样一段文字。 1 、 ReadFile 的调用不会引起设备的任何反应,即 HID 设备与主机之间的中断 IN 传输不与 ReadFile 打交道。实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。“读取”即意味着从某个 buffer 里面取回数据,实际上这个 buffer 就是 HID 设备驱动中的 buffer 。这个 buffer 的大小可以通过 HidD_SetNumInputBuffers 来改变。在 XP 上缺省值是 32 (个报告)。 实贱表明: 是”USB人体输入学设备驱动“会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。然后将数据收到自已驱动中的 buffer!但ReadFile也不直接与”USB人体输入学设备驱动“打交道!有兴趣大家可以用BUS HOUND看一下!你只监视”USB人体输入学设备“,你不调用ReadFile,下位机也会有数据发上来。BUS HOUND可以看到数据。下位机没数据时!你调用ReadFile,”USB人体输入学设备“,也不会有动作! 而当您监视了!HID compliant device设备,你不ReadFile,就是”USB人体输入学设备“有接收到数据,HID compliant device设备也不会有数据请求的!只有当你ReadFile了!HID compliant device设备就会出现一次数据请求!你就能看到HID compliant device的数据。 更细一点的测试是!HID下位机连发了向个报告时(ReadFile不去读),”USB人体输入学设备驱动“会都接收这些报告数据,然后放在自己的buffer中!接收你调用一次ReadFile,”HID compliant device驱动“就会向”USB人体输入学设备驱动“请求一次数据,然后它如果和ReadFile相交成功的话,ReadFile就会正确读到一个报告数据。你再调用ReadFile会再读到一个!直到”USB人体输入学设备驱动“收到的数据全部被读完! 现在的我的情况就出现在HID compliant device驱动和ReadFile相交这块!ReadFile绝大多数时可以成功读到数据,但总会不定期的有一次不成功! 还有一个怪的现象!ReadFile好象只是发出了一个Windows IO请求,而这个Windows IO请求好象没成功和”HID compliant device驱动“交互。因为从现象上看HID compliant device设备驱动好象没有超时机制!如ReadFile后 wait用永久等待的方式在等,当出现这种情况程序会卡死在这里永远等待,但当下一次下位机设备发上新的数据时!wait也会结束等待,读出最新的数据。而不成功的那次数据就好象从来没出现过一样,人间蒸发了!这中间到底那块出了问题!是我想知道的! 有没有明白这块驱动机制的达人细一点的讲述一下,HID compliant device设备驱动向”USB人体输入学设备“请求数据 及和Readfile交互的细节!猜想分析都行!
sxslyy 2014-01-12
  • 打赏
  • 举报
回复
看这包! 23.1 DI 01 01 00 00 00 00 00 10ms HID compliant device驱动 HID compliant device设备驱动好象已经向USB人体输入学设备驱动请求数据了!也得到了回应,数据也在总线上传递了!所以BUS HOUND抓包才能抓着上面这包数据。 但好象HID compliant device设备驱动 可能没能正确的接收到这段数据。或收到了不能放到自已的USB接收缓冲区中,或收到了不全的数据,Readfile读不到足够的数据。有没有方法来判断具体是那种情况!即在Readfile失败后有相关的错误信息指明是何种错误引起的! 有没有明白这块驱动机制的达人细一点的讲述一下,HID compliant device设备驱动请求数据及和Readfile交互的细节!猜想分析都行!
sxslyy 2014-01-12
  • 打赏
  • 举报
回复
worldy您好: 24 DI 01 01 43ms USB人体输入学设备驱动 23.1 DI 01 01 00 00 00 00 00 10ms HID compliant device驱动 您看抓包的数据。一个是43ms,一个是10ms, 10ms数据通信还不能完成么!要真是这样也太慢了!太七个字节! hdg3707您好: 1.读线程的优先级是THREAD_PRIORITY_TIME_CRITICAL,是最高的了,HID compliant device设备驱动的优先级无从得知!很象是USB接收缓冲区不能及时收到数据!如何提前检测到呢!有没有方法! 2.读数据时我中指定了Capabilities.InputReportByteLength(即最长报告的长度,HID始有多个报告,是需要读最大报告的长度的),数据数量不够,数据也应该被放到了USB接收缓冲区!可为什么下次成功读到时,这部分不全的数据会被忽略了呢!因为下次成功时,我读到的数据就是设备新发过来的数据。原来不全的数据去哪了呢!驱动是以什么机制清理的缓冲区呢!网上查到USB缓冲区是一个可指定大小的缓冲区,我指定的大小是256,可以循环存256个报告,所以应该不会有后一个报告数据覆盖掉前一个不全的报告数据!搞不明白HID compliant device设备驱动这块对数据缓冲区及如何与Readfile交互的机制!有明白这块的大牛给解析一下吗!
worldy 2014-01-11
  • 打赏
  • 举报
回复
usb设备是串行数据,要等待数据通信完成?
hdg3707 2014-01-11
  • 打赏
  • 举报
回复
会不会是优先级低,导致USB接收缓冲区不能及时收到数据或者你读数据时指定了数量,但因为操作系统调度问题导致数据数量不够使你的读函数进入阻塞并导致这次的读取失败

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧