|
USB HID 设备获取字符串描述符失败,着急!
[复制链接]
前提条件:设备句柄hid_dev_ok 用CreateFile()建立是好的。
硬件上写的firmware我也确认是好的,用bushound,来读取我长达200个char长度的字符串描述符没有问题。
但用VC2005编译环境(包含DDK的库调用),弄出来的程序获取设备字符串描述符就出问题如下:
方法1: 用DDK系统自带HID驱动的函数获取如下:
下面代码在我获取的字符串描述符序号index=7,8,9 描述符长度200字节时返回失败,错误代码1784:buffer invalid
但是只要我在函数HidD_GetIndexedString()运行前,强制设置index=4 (访问设备上另一个长度为24字节的描述符),就一切OK ?
为什么?USB 协议没有规定string descriptor 的长度啊!难道windows的HID驱动自己加了限制?此路不通?
DWORD GetMyStr( char index, char * p_out_buf ,UINT buf_size=202 )
{
BOOL result;
DWORD err_code;
result=HidD_GetIndexedString (
hid_dev_ok, // IN HANDLE HidDeviceObject,
(ULONG)index , // IN ULONG StringIndex,
p_out_buf, // OUT PVOID Buffer,
buf_size // IN ULONG BufferLength
);
if( result ==TRUE)
return 0;
else
{
err_code = GetLastError(); // err_code=1784
return err_code;
}
}
------------
方法二: 用DeviceIoControl()加操作码 IOCTL_GET_USB_DESCRIPTOR 来获取,仍然失败
PUSB_STRING_DESCRIPTOR p_temp_str_dsc;
p_temp_str_dsc = (PUSB_STRING_DESCRIPTOR) malloc( 255 );
p_temp_str_dsc->bLength = 254; //
//
USBSCAN_GET_DESCRIPTOR temp_str_get_type;
temp_str_get_type.DescriptorType = USB_STRING_DESCRIPTOR_TYPE ; // 0x03
temp_str_get_type.Index = 0x03;
temp_str_get_type.LanguageId = 0x0904 ;//-----
//
read_done=CreateEvent(0, false, true, NULL); // The creates or opens a event object with initial state= signaled !
OVERLAPPED Device_ovl = {0, 0 , 0, 0 , read_done };
BOOL temp_bool;
temp_bool=DeviceIoControl( hid_dev[Index], // HANDLE hDevice,
IOCTL_GET_USB_DESCRIPTOR, // DWORD dwIoControlCode,
&temp_str_get_type, // LPVOID lpInBuffer,
sizeof(USBSCAN_GET_DESCRIPTOR), // DWORD nInBufferSize,
p_temp_str_dsc, // LPVOID lpOutBuffer,
254, // DWORD nOutBufferSize,
&temp_num, // LPDWORD lpBytesReturned,
&Device_ovl // LPOVERLAPPED lpOverlapped
);
temp_num = WaitForSingleObject( read_done, 1000);
temp_num = GetLastError();
这个更惨,大小字符串描述符都失败->debug时候看,接收缓冲区P_temp_dtr_dsc 没有得到新数据,
但DeviceIoControl() 返回true,GetLastError返回0!怎么回事呢?
-------
浏览了一下这里USB相关的帖子,几乎没有成功解答的,唉!我这个估计也......
有慈悲心的再个推荐和好BBS,我再问问。
|
|