15274|10

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

读取HID设备数据时ReadFile超时的问题 [复制链接]

以前都是搞应用开发的,现在突然来了个紧急任务,软件要和一个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,程序直接就卡死在那里了。
刚才试了一下DeviceIOControl(...,IOCTL_HID_GET_INPUT_REPORT,...)居然也报超时...

请各位高手帮忙分析一下,问题可能出在哪?需要我贴一下UPS Hound抓的数据包吗?

最新回复

问题找到了,是固件程序的问题,那个硬件工程师好像把一些reportID信息搞错了。 谢谢各位的关注!  详情 回复 发表于 2009-11-24 11:28
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大家看看设备有问题吗?

这是从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 0 OUT: Type=INT Class=03 SubClass=00 Protocol=00 MaxTranfer=4096
EndPoint 0 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                                                
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
通过BUS HOUND看到的USB向PC发送的数据是你想要的数据吗?还是仅仅是些协议上的东西?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
上面关于设备的信息写错了!
应该是这样:
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
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 veabol 的回复:
通过BUS HOUND看到的USB向PC发送的数据是你想要的数据吗?还是仅仅是些协议上的东西?

没错,是我要的数据:
24.1  DI    0a e2 7c f7  e9 ea 21 1f  37 ce 96 f6  56 fa 7e
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
程序中是否需要指明从哪个端点读取数据呢?没做过上层程序开发,只是根据USB的特性问的。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 veabol 的回复:
程序中是否需要指明从哪个端点读取数据呢?没做过上层程序开发,只是根据USB的特性问的。

据说ReadFile和WriteFile是和驱动来打交道,由驱动再来判断通过哪个端点和设备交互。

问句外行话:
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
输入输出用同一个端点是对的吗?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
用同一个端点应该是没问题,不少设备都是用的同一个端点。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
疯了!我用DDK自带的那个hclient例子来试,HidD_GetInputReport同样是超时(错误代码121)!
只有Bus Hound才能捉到它发来的设备,不知道Bus Hound大致是什么样的工作原理?

这块板子好神奇啊!
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

10
 
换了个其它设备,也是HID中断传输的方式,根据描述符配置好相关参数之后,通信一切正常。

现在怀疑是这块板子固件程序的问题,或者是描述符哪里出错了。对这方面真是一窍不通,还请众位高手帮忙分析一下原因,万分感谢!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
问题找到了,是固件程序的问题,那个硬件工程师好像把一些reportID信息搞错了。

谢谢各位的关注!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表