6308|2

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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,我再问问。

最新回复

你好请问该问题解决了?我也遇到了,求指教  详情 回复 发表于 2017-7-13 13:58
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以看看DDK的例子src\wdm\usb\usbview的实现...
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

板凳
 
你好请问该问题解决了?我也遇到了,求指教
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表