USB HID 小记

最近帮同事搞一个项目,他的USBHID设备不断向主机发送实时数据,让我帮忙写一个上位机程序实时读取他的数据并进行处理。结果拿到设备后,发现可以通过Bus Hound读取出数据,例如0d,db,80,ff,01 ,这些都是该设备传回的实时数据。由于对USBHID设备不熟悉,

开始研究USBHID设备,查找了几篇文献和网上的一些文章,终于有些眉目。这里先记下来。

首先,我去书店看了一眼《圈圈教你玩转USB》,貌似是第二版?主要看了前面USB1.1协议中的几个描述符,和HID特有的报告描述符。

单从硬件上来说,各个USB从设备对主机都是一样的,因为只有4根线而已。所以这么多USB设备的分类就只能靠软件来区分。具体的就是通过各种描述符来进行配置、区分。说简单点就是从设备在刚与主机连接时(USB枚举过程),进行了设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符和报告描述符的提交,从设备通过这些描述符把自己的配置、特点、功能等等告诉主机。

明白了这点后,在百度上查了下“如何读取USBHID设备”,搜到了大把的文章,大多数都是利用hid.dll、kernel32.dll、setup.dll这三个库的API来完成读写。过程的话大同小异,都是先获得path,再createfile得到handler,最后通过handler读写。这里国外有几个网站有开源的C#程序,网址的话。。自己搜吧。。。

紧接着,我的问题出现了,readfile时永远返回0,getlasterror不是1784就是87,网上或者MSDN都可以查到错误代表什么,调了半天最后卡在一个问题上,我利用hid_getcaps读到了buffer长度,也就是readfile(...,buffer,bufferlength,...)其中的应该读取的长为61,当我设定bufferlength的值小于这个61时,出现1784号error,当我这个值大于等于61时,卡死在readfile这个函数(因为我是同步读取(readfile最后一个参数))。。。百思不得其解。

于是又重新看了一下USB1.1的协议和描述符说明,尤其是报告描述符说明。其中报告描述符描述了返回数据的报告种类,以及每种报告的数据格式。看到这里时,我怀疑有可能是因为设备的报告描述符配置错了,导致其返回给我的5字节数据例如0d,db,80,ff,01,被windowsHID驱动自动过滤掉了,因此一直无法获取数据。

因此将下位机程序要来,以及其开发环境。打开下位机程序,发现其报告描述符与上传的数据完全不符,其中报告ID即报告种类没有0d,因此上传的0d,db,80,ff,01会被主机驱动过滤掉。当然,修改报告ID,并将数据补齐,就可以通过readfile的方式读取端点2上的数据了(当然是中断传输)。

另外,readfile和writefile的读写方法都是中断传输,只能读写中断端点,设备的0端点不是中断端点,其他端点需要配置。另外,每个端点可以同时被配置为中断输出和中断输入端点。

先写到这,后面的程序和链接有空补上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章