阅读:5803回复:3
有一个USB HID设备读写数据问题,请大家帮帮忙!
各位!最近我在做一USB数据卡,我把它配置成一个HID设备(因为不想写驱动),但问题来了:我在调用CreateFile函数,
HidD_GetAttributes函数都能成功得到我的VID和PID,HidD_GetManufacturerString函数调用也正常返回我的数据,可是调用 ReadFile(),WriteFile(),HidD_SetFeature()都返回是0.奇怪的是HidD_GetFeature却能成功调用,得到我的数据.我搞了一个星期 也没什么进展,但我想这跟我的报告描述符有点关系.下面把代码贴出来大家帮我看看,在下谢谢了. 下面是下位机报告描述符,我不太了解报告描述用法,这是我参考别人的描述符配置的,其实我的要求就是通过控制端点发送和接收我的 数据(15字节数据加一个报告ID总共16个字节),我用的芯片是D12.我用Bus Hound测试过,发送接收数据都正常. code unsigned char ReportDescriptor[] = { 0x06, 0xA0, 0xff, // USAGE_PAGE (Vendor Defined)---------用法页(厂商定义) 0x09, 0x01, // USAGE (Vendor Usage 1))-------------用法(厂商用法1) 0xa1, 0x01, // COLLECTION (Application)------------集合(应用集合) 0x09, 0x02, // USAGE (Vendor Usage 2))-------------用法(厂商用法2) 0xa1, 0x00, // COLLECTION (Physical))------------集合(物理集合) 0x06, 0xA1, 0xff, // USAGE_PAGE (Vendor Defined)-----用法页(厂商定义) //特征报告 0x09, 0x03, // USAGE (Vendor Usage 3))---------用法(厂商用法3) 0x15, 0x00, // --- LOGICAL_MINIMUM (0)-------------逻辑最小值(0) 0x25, 0xff, // - LOGICAL_MAXIMUM (255)-----------逻辑最大值(255) 0x35, 0x00, // - PHYSICAL_MINIMUM (0)------------物理最小值(0) 0x45, 0xff, // - PHYSICAL_MAXIMUM (255)----------物理最大值(0) 0x75, 0x08, // - REPORT_SIZE (8)-----------------报告大小(8bit) //加入下面的报告ID后HidD_GetFeature函数也不能调用成功了,返回错误号23,好像是说CRC问题. // 0x85, 0x4D, // - REPORT_ID (77)------------------报告ID(4D) 0x95, 0x0f, // - REPORT_COUNT (15)---------------报告个数(15) 0xb1, 0x02, // --- FEATURE (Data,Var,Abs)----------特征(数据,变量,绝对值) 0xc0, // END_COLLECTION--------------------关集合 0xc0 // END_COLLECTION----------------------关集合 }; //下面是上位机VC程序 HidD_GetHidGuid(&guidHID);//获取HID设备的类标识(GUID) HDEVINFO hDevInfo = SetupDiGetClassDevs(); SetupDiEnumDeviceInterfaces(); SetupDiGetDeviceInterfaceDetail(); HANDLE hCom = CreateFile( strtDetailData->DevicePath, //设备路径 GENERIC_READ | GENERIC_WRITE, //可以读写 0, //不共享 NULL, OPEN_EXISTING, //打开现有的(如果文件不在,失败) FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//没有属性,异步方式读写 NULL);//这里应该是一个结构体,现在先不用. HidD_GetAttributes(); HidD_GetManufacturerString(); //直到这里我上面的函数都能调用成功, //可就是下面的函数读写错误. success = HidD_GetFeature ( //在描述符里不加入报告ID可以返回我要的数据,加入报告ID后错误,错误代码为23 hidDevice, InputReport, 17 ); if(!success) { int Errornumber = GetLastError();//加入报告ID后错误,错误代码为23 return success; } ///////////////////这个函数一直都返回0,错误号也是23/////////////////////// BYTE OutputReport[17] = "MMMMMMMMMMMMMMMM" ; success = HidD_SetFeature ( hidDevice, OutputReport, 17 ); if(!success) { int Errornumber = GetLastError(); return success; } //////////////////////////这个函数也是不正常,返回错误号78,好像是参数不对,可我查了参数没问题呀////////////////////////////////////// DWORD len = 17; BOOL success = WriteFile( hidDevice, //设备句柄 OutputReport, //写入数据指针 len, //写入数据长度 &TransBytes, //实际写入的字节 NULL); //如果为异步写,要用到 if(!success) { int Errornumber = GetLastError(); return -1; } /////////////////////////////这个函数也同样不正常,返回错误号78,////////////////////////////// BOOL success = ReadFile( hidDevice, //设备句柄 InputReport, //保存数据指针 17, //读取数据大小 &TransBytes, //实际读取的字节数 NULL); if(!success) { int Errornumber = GetLastError(); return -1; } |
|
|
沙发#
发布于:2008-05-12 08:41
问题解决了,(高兴ing),那就是OutputReport[17] 数组的第一个字节的值必需是0.
|
|
|
板凳#
发布于:2008-05-14 15:22
真替你高兴!
我搞了个一样的事,可到现在也没成功,楼主能指点一二么,我的读文件可以,但写文件却失败! |
|
地板#
发布于:2008-05-29 16:24
HID设备是系统独占型设备.只能用来读.写不了.
这个我也试过.createfile(),得到句柄.readfile(),writefile都不成功. HidD_GetAttributes() HidD_GetManufacturerString() HidD_GetProductString() HidD_GetPreparsedData() HidP_GetCaps() 就是用readfile(),writefile()不成功. 你可以试一下DeviceIoControl() 这个可以用来读写USB的控制端口endpoint0. 不过要设定好正确的参数. |
|