求:ReadFile与HID compliant device(自定义HID的设备驱动)通讯时有时超时的原因?
我碰到的情况是这样的!
用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设备驱动”自身的数据缓存不可用吗?
等等可能的原因。
注:握手重发的机制我的程序都有!程序可以正常通讯工作!我主要是想请理解类似驱动原理的高手指点一下出现这种情况的原因及有没有办法可以提前检测这种情况。
敬上!