比如俺的Report Descriptor就是这个样子的:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (0)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xff, // LOGICAL_MAXIMUM (255)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x08, // USAGE_MAXIMUM (8)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x08, // USAGE_MAXIMUM (8)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
其实就是定义了八个字节的输入和八个字节的输出而已。
当一切Descriptor都回复妥当以后,就需要测试一下了,使用的测试程序是Jan Axelson的测试程序,风别有VB6和VC6两个版本,对其进行了一点点修改,VB的增加了直接在界面输入Vendor ID和Product ID,把接收数据显示也改了一下,原版的显示光标在最后,给人感觉就像数据收错了。VC的把接收的ReportID在显示的时候去掉了,不然看起来比下位机发的多出了一个0x00,怪怪的,此外还把hid.lid,setupapi.lib以及几个头文件放在了包里面并做了部分修改,这样下载就可以直接编译了,如果遇到以下错误:
“DBT_DEVTYP_DEVICEINTERFACE, PDEV_BROADCAST_DEVICEINTERFACE, HDEVNOTIFY, DEVICE_NOTIFY_WINDOW_HANDLE undeclared”
则需要在stdafx.h里面增加#define WINVER 0x0500就OK了。
现在就可以进行测试了,在测试程序的VID和PID中输入正确的数字(16进制的),点击Once就可以看到一次收发了,如果TimeOut的话肯定是下位机有点问题,比如没有不断的往上传IN的数据,或者OUT数据没有读走阻塞住了。
测试程序及其源码下载地址:
VB6:http://download.csdn.net/source/2719482
VC6: http://download.csdn.net/source/2719489 |