ReadFile异步读HID时!不定期会读超时。

sxslyy 2013-12-17 07:53:27
注意:大多数是通讯是正常的!上位机写指令,下位机发数据给上位机读,再写,再读,以完成通讯同步。
中间几千次写读交互中,可能不定期出现一次,读超时。

抓包情况:

24 DI 01 01 43ms 人体力学驱动
23.1 DI 01 01 00 00 00 00 00 10ms windows的自定义HID的驱动

ReadFile 异步IO 超时为5000MS.

情况就如上面抓包的数据。

下位机已成功上传了数据,如:
24 DI 01 01 43ms 人体力学驱动

Readfile已发出了IO请求,windows的自定义HID的驱动也响应了!如:
23.1 DI 01 01 00 00 00 00 00 10ms windows的自定义HID的驱动

理论上Readfile应可以从驱动的缓存区中读取数据了!但实际上却等时5000ms后还是超时没读到。
感觉是Read IO读取没能完成!求教是什么情况可能引起读失败(还是在抓包软件可以看到数据的情况下)。
改同步也是一样!会读死。

可能的原因会是什么呢!

1.可能是windows的自定义HID的驱动向驱动的缓存区存入数据时出错了(丢字节),使Readfile没有读够想要的字节数吗?

2.可能是在设定的时间读IO一直被挂起吗(改同步,出现这种情况中就读死了,IO永远被挂起了)?

3.接收程序有错(几千次正确交互中会有一次,会是程序的问题吗)?


...全文
697 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxslyy 2014-01-13
  • 打赏
  • 举报
回复
我碰到的情况是这样的! 用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设备驱动”自身的数据缓存不可用吗? 等等可能的原因。 注:握手重发的机制我的程序都有!程序可以正常通讯工作!我主要是想请理解类似驱动原理的高手指点一下出现这种情况的原因及有没有办法可以提前检测这种情况。 有没有明白这块驱动机制的达人细一点的讲述一下,HID compliant device设备驱动向”USB人体输入学设备“请求数据 及和Readfile交互的细节! http://bbs.csdn.net/topics/390691197
lgstudyvc 2013-12-30
  • 打赏
  • 举报
回复
加握手,再试
sxslyy 2013-12-30
  • 打赏
  • 举报
回复
lfchen版主:驱动是windows自身的HID驱动,所以不知驱动是否有问题!另:ReadFile参数中的缓冲区我定义了256,实际上只读19个字节所以不满,应该可用。 但windows自身的HID驱动的缓存区是否已满?或者不可用?这个如何判断!
一条晚起的虫 2013-12-19
  • 打赏
  • 举报
回复
// 驱动是否有问题? // 缓冲区是否已满?或者缓冲区不可用?
yifuzhiming 2013-12-18
  • 打赏
  • 举报
回复
还是用异步的吧,不要用同步的,是不是可能单片机的问题,再考虑下这种概率可不可接受
sxslyy 2013-12-18
  • 打赏
  • 举报
回复
24 DI 01 01 43ms 人体力学驱动 这个数据就是单片机送上来的!说明驱动应该是收到了。 我就是用异步的方式,概率的问题,我有重发机制!可以解决! 我就是想知道为什么会出现这种情况!问题会出在哪里!

2,641

社区成员

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

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