mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:5806回复:3

有一个USB HID设备读写数据问题,请大家帮帮忙!

楼主#
更多 发布于:2008-05-11 18:01
    各位!最近我在做一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;
    }
    
    
驱网无线,快乐无限
doneing
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2008-07-23
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-05-29 16:24
HID设备是系统独占型设备.只能用来读.写不了.
这个我也试过.createfile(),得到句柄.readfile(),writefile都不成功.
HidD_GetAttributes()
HidD_GetManufacturerString()
HidD_GetProductString()
HidD_GetPreparsedData()
HidP_GetCaps()
就是用readfile(),writefile()不成功.

你可以试一下DeviceIoControl()
这个可以用来读写USB的控制端口endpoint0.
不过要设定好正确的参数.
sgxl16
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2008-06-20
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-14 15:22
真替你高兴!
我搞了个一样的事,可到现在也没成功,楼主能指点一二么,我的读文件可以,但写文件却失败!
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-05-12 08:41
问题解决了,(高兴ing),那就是OutputReport[17] 数组的第一个字节的值必需是0.
驱网无线,快乐无限
游客

返回顶部