读取HID设备数据时ReadFile超时的问题

大王派我去巡山 2009-11-20 11:26:16
以前都是搞应用开发的,现在突然来了个紧急任务,软件要和一个USB(HID)设备进行通信。

毫无头绪,只好硬着头皮上网查了一大堆资料。现在查找设备、发送数据都成功了,但一直读不到数据。
我用UPS Hound来抓数据,发现设备一直在向PC发数据,大约20ms一次,但我的程序就是收不到!


设备描述符如下:
#define DESNUM 0x26
char code ReportDescriptor[DESNUM] =
{
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)

0x85, 0x01, // REPORT_ID (1)
0x95, 0x0f, // REPORT_COUNT (15)
0x75, 0x08, // REPORT_SIZE (8)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x81, 0x02, // INPUT (Data,Var,Abs)

0x85, 0x02, // REPORT_ID (2)
0x95, 0x04, // REPORT_COUNT (4)
0x75, 0x08, // REPORT_SIZE (8)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x02, // OUTPUT (Data,Var,Abs)

0xc0 // END_COLLECTION
};



不管是同步还是异步方式读写数据,情况都类似:
WriteFile()成功,但HidD_SetOutputReport()却不行,GetLastError显示错误号为121,查了一下是超时;
ReadFile()和HidD_GetInputReport(),这两个都超时!如果采用同步的方式ReadFile,程序直接就卡死在那里了。
请各位高手帮忙分析一下,问题可能出在哪?需要我贴一下UPS Hound抓的数据包吗?
...全文
742 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-11-24
  • 打赏
  • 举报
回复
大王同志好久不见了!怎么开始研究起硬件了?

帮顶一下吧!
  • 打赏
  • 举报
回复
问题找到了,是固件程序的问题,那个硬件工程师好像把一些reportID信息搞错了。

谢谢各位的关注!
Dingnifei123 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dlyme 的回复:]
换了个其它设备,也是HID中断传输的方式,根据描述符配置好相关参数之后,通信一切正常。

现在怀疑是这块板子固件程序的问题,或者是描述符哪里出错了。对这方面真是一窍不通,还请众位高手帮忙分析一下原因,万分感谢!
[/Quote]
竟然怀疑,那就找个同样的试试会不会出现同样的情况啊,
用户 昵称 2009-11-21
  • 打赏
  • 举报
回复
有能用的就行了吧,俺们用bus hound来抓,不过只限于看看描述符是否出来了。
  • 打赏
  • 举报
回复
换了个其它设备,也是HID中断传输的方式,根据描述符配置好相关参数之后,通信一切正常。

现在怀疑是这块板子固件程序的问题,或者是描述符哪里出错了。对这方面真是一窍不通,还请众位高手帮忙分析一下原因,万分感谢!
fandh 2009-11-20
  • 打赏
  • 举报
回复
这个不懂,帮楼主顶!
  • 打赏
  • 举报
回复
大家看看设备有问题吗?

这是从Bus Hound中Properties栏中的设备信息:
BUS Type: USB
Device Type: Human Interface Device
Power Draw: 100 milliamps @ 5.0 volts
EndPoint 0: Type=CTL Class=03 SubClass=00 Protocol=00 MaxTranfer=65535
EndPoint 1 OUT: Type=INT Class=03 SubClass=00 Protocol=00 MaxTranfer=4096
EndPoint 1 IN: Type=INT Class=03 SubClass=00 Protocol=00 MaxTranfer=4096


下面是Bus Hound截取到的数据,只发一小段:
us Hound 5.00 capture. Complements of www.perisoft.net

Device - Device ID (followed by the endpoint for USB devices)
(24) USB 人体学输入设备
Phase - Phase Type
CTL USB control transfer STAK NT IRP stack location
DI Data in URB USB request block
IRP NT I/O request packet USTS USB status
LEN Data length
Data - Hex dump of the data transferred
Descr - Description of the phase
Delta - Elapsed time from the previous phase to the current phase
Cmd... - Position in the captured data
Date - Date the phase occurred in year/month/day form
Time - Time the phase occurred in hour:minute:second.millisec form


Device Phase Data Description Delta Cmd.Phase.Ofs(rep) Date Time
------ ----- -------------------------------------------------- ---------------- ----- ------------------ ---------- ------------
24 IRP 06 00 90 01 00 00 00 00 00 00 00 00 00 00 00 00 39ms 156.1.0 2009-11-19 23:59:39.505
58 f8 b0 84 58 f8 b0 84 00 00 00 00 00 00 00 00 156.1.16
00 01 04 04 00 00 00 04 00 00 00 00 00 00 00 00 156.1.32
00 00 00 00 00 00 00 00 00 00 00 00 e8 10 cb 84 156.1.48
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.64
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.80
24 f9 b0 84 00 00 00 00 00 00 00 00 00 00 00 00 156.1.96
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.112
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.128
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.144
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.160
00 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 156.1.176
00 00 00 00 00 00 00 00 00 00 00 00 30 c0 03 85 156.1.192
00 00 00 00 7d f6 a9 f7 90 72 b5 84 0f 00 00 e0 156.1.208
10 00 00 00 00 00 00 00 0b 00 0b 00 00 00 00 00 156.1.224
48 2c cf 84 00 00 00 00 ca 7e a0 f7 14 2d cf 84 156.1.240
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.256
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.272
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.288
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.304
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.320
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.336
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.352
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.368
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.1.384
24 STAK 0f 00 00 e0 80 cf cd 84 00 00 00 00 03 00 22 00 INTERNAL IOCTL 35us 156.2.0 2009-11-19 23:59:39.505
00 00 00 00 30 32 f0 84 00 00 00 00 94 89 f2 f3 156.2.16
80 cf cd 84 156.2.32
24.1 LEN 0f 00 00 00 15 16us 156.3.0 2009-11-19 23:59:39.505
24.1 DI 0a e2 7c f7 e9 ea 21 1f 37 ce 96 f6 56 fa 7e ......!.7...V.. 7us 156.4.0 2009-11-19 23:59:39.505
24.1 URB 48 00 09 00 00 00 00 00 38 c6 d4 84 22 00 00 00 BULK/INT XFER 6us 156.5.0 2009-11-19 23:59:39.505
bc 3a c8 84 03 00 00 00 0f 00 00 00 e8 10 cb 84 156.5.16
b0 9d e5 84 00 00 00 00 ff ff ff ff 0d f0 ad de 156.5.32
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 156.5.48
00 00 00 00 00 00 00 00 156.5.64
  • 打赏
  • 举报
回复
试了一下,DeviceIOControl(...,IOCTL_HID_GET_INPUT_REPORT,...)居然也报超时...

2,640

社区成员

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

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