您现在的位置: 爱51代码网 >> 范文 >> 文章正文
使用getlasterror返回值一直是0x57

最近使用VS2005 SDK开发一个USB-HID的应用程序,现在对于hid设备能识别出来,creatfile也没问题,但是继续writefile的时候出问题,使用getlasterror返回值一直是0x57
代码和网上给的例程都是一致的,现在使用BusHound软件能够和hid设备通信,能观察到下发和上传的数据,这样能证明底层USB驱动没问题么?
我现在定位不了错误,不知道怎么继续解决了,希望大牛能帮我分析下

/* 1) Get the HID Globally Unique ID from the OS */
                HidD_GetHidGuid(&HidGuid);
 
 
                /* 2) Get an array of structures containing information about
                all attached and enumerated HIDs */
                HidDevInfo = SetupDiGetClassDevs(  
                                                    &HidGuid,
                                                    NULL,
                                                    NULL,
                                                    DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
 
                /* 3) Step through the attached device list 1 by 1 and examine
                each of the attached devices.  When there are no more entries in
                the array of structures, the function will return FALSE. */
                
                Index = 0;                                    /* init to first index of array */
                devInfoData.cbSize = sizeof(devInfoData);    /* set to the size of the structure
                                                            that will contain the device info data */
                
                do {
                    /* Get information about the HID device with the 'Index' array entry */
                    Result = SetupDiEnumDeviceInterfaces(    HidDevInfo,
                                                            0,
                                                            &HidGuid,
                                                            Index,
                                                            &devInfoData);
                    
                    /* If we run into this condition, then there are no more entries
                    to examine, we might as well return FALSE at point */
                    if(Result == FALSE)
                    {
                        /* free the memory allocated for DetailData */
                        if(detailData != NULL)
                            free(detailData);
                        
                        /* free HID device info list resources */
                        SetupDiDestroyDeviceInfoList(HidDevInfo);
                        
                        return FALSE;
                    }
 
 
                    if(GotRequiredSize == FALSE)
                    {
                        /* 3) Get the size of the DEVICE_INTERFACE_DETAIL_DATA
                        structure.  The first call will return an error condition,
                        but we'll get the size of the strucure */
                        DIDResult = SetupDiGetDeviceInterfaceDetail(    HidDevInfo,
                                                                    &devInfoData,
                                                                    NULL,
                                                                    0,
                                                                    &DataSize,
                                                                    NULL);
                        GotRequiredSize = TRUE;
 
                        /* allocate memory for the HidDevInfo structure */
                        detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(DataSize);
                                                                    
                        /* set the size parameter of the structure */
                        detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                    }
                            
                        
                    /* 4) Now call the function with the correct size parameter.  This
                    function will return data from one of the array members that
                    Step #2 pointed to.  This way we can start to identify the
                    attributes of particular HID devices.  */
                    DIDResult = SetupDiGetDeviceInterfaceDetail(    HidDevInfo,
                                                                &devInfoData,
                                                                detailData,
                                                                DataSize,
                                                                &RequiredSize,
                                                                NULL);
                        
 
                    /* 5) Open a file handle to the device.  Make sure the
                    attibutes specify overlapped transactions or the IN
                    transaction may block the input thread. */
 
                    *HidDevHandle = CreateFile( detailData->DevicePath,
                                                0,
                                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                                (LPSECURITY_ATTRIBUTES)NULL,
                                                OPEN_EXISTING,
                                                NULL,
                                                NULL);
 
                        
                    /* 6) Get the Device VID & PID to see if it's the device we want */
                    if(HidDevHandle != INVALID_HANDLE_VALUE)
                    {
                        HIDAttrib.Size = sizeof(HIDAttrib);
                        HidD_GetAttributes(    *HidDevHandle, &HIDAttrib);                      
                        if((HIDAttrib.VendorID == VID) && (HIDAttrib.ProductID == PID))
                        {      
                                                        hDev = CreateFile(
                                                detailData->DevicePath,
                                                GENERIC_WRITE,
                                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                                (LPSECURITY_ATTRIBUTES)NULL,
                                                OPEN_EXISTING,
                                                0,                        //for write
//                                                FILE_FLAG_OVERLAPPED,   //for read
                                                NULL);
                            
                            if(hDev == INVALID_HANDLE_VALUE){
                                DWORD err = GetLastError();
                            }else{
 
                                HIDP_CAPS        Capabilities;
                                PHIDP_PREPARSED_DATA        HidParsedData;
                                OVERLAPPED        HidOverlapped;
                                HANDLE            ReportEvent;
                                unsigned char*    outbuffer[7] = 0;
                                unsigned char   inbuffer[33] = {0};
                                DWORD numBytesReturned;
                                
                                                                outbuffer[0] = 0x05;  
                                outbuffer[1] = 0x07;  
                                outbuffer[2] = 0x11;
                                outbuffer[3] = 0x22;
                                outbuffer[4] = 0x33;
                                outbuffer[5] = 0x44;
                                outbuffer[6] = 0x55;
                                
                                HidD_GetPreparsedData(hDev, &HidParsedData);
        
                                /* extract the capabilities info */
                                HidP_GetCaps( HidParsedData ,&Capabilities);
        
                                /* Free the memory allocated when getting the preparsed data */
                                HidD_FreePreparsedData(HidParsedData);
 
                                
                                if(!WriteFile(hDev,
                                    outbuffer,
                                    Capabilities.OutputReportByteLength,
                                                                        &numBytesReturned,
                                    NULL)){
                                    DWORD err = GetLastError();
                                }

Capabilities.OutputReportByteLength的值是多少
这个值应该比你的下位机读取长度大1

Capabilities.OutputReportByteLength = 0x21
下面是下位机中的USB相关描述符

unsigned char code Config_Descriptor[0x0029] =
{
    /* 1 single Config_Descriptor */
    0x09,                       //bLength
    0x02,                       //bDescriptorType
    W2B(0x0029),                //wTotalLength(09+09+36+07+07)
    0x01,                       //bNumInterfaces               
    _BCFG_VALUE,                //bConfigurationValue
    0x00,                       //iConfiguration
    0x00,                       //bmAttributes
    0x32,                       //bMaxPower
 
    /* 2 Interface Descriptor */
    0x09,                       //bLength
    0x04,                       //bDescriptorType
    0x00,                       //bInterfaceNumber
    0x00,                       //bAlternateSetting
    0x02,                       //bNumEndpoints
    0x03,                       //bInterfaceClass
    0x00,                       //bInterfaceSubClass
    0xff,                       //bInterfacePortocol
    0x00,                       //iInterface
        
    /* 3 HID Descriptor */
    0x09,                        //HID DESCR
    0x21,
    0x00,
    0x01,
    0x21,
    0x01,
    0x22,
    0x21,
    0x00,
        
    /* 4 Bulk-OUT Endpoint Descriptor */
    0x07,                       //bLength
    0x05,                       //bDescriptorType
    0x82,                       //bEndpointAddress
    0x03,                       //bmAttributes
    W2B(0x0020),                //wMaxPacketSize
    0x01,                       //bInterval
 
    /* 5 Bulk-IN Endpoint Descriptor */
    0x07,                       //bLength
    0x05,                       //bDescriptorType
    0x02,                       //bEndpointAddress
    0x03,                       //bmAttributes
    W2B(0x0020),                //wMaxPacketSize
    0x01                        //bInterval
};
 
 
unsigned char code HID_Descriptor[0x21] =
{
    0x06,
    0x00,
    0xFF,
    0x09,
    0x01,
    0xA1,
    0x01,
    0x19,
    0x01,
    0x29,
    0x08,
    0x15,
    0x00,
    0x26,
    0xFF,
    0x00,
    0x75,
    0x08,
    0x95,
    0x20,                                      
    0x81,
    0x02,
    0x19,
    0x01,
    0x29,
    0x08,
    0x75,
    0x08,
    0x95,
    0x20,
    0x91,
    0x02,
    0xC0
};

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    AD14如何输出DWG文件
    Keil-v5开发STM32F103RCT6的
    BKP_DR寄存器中的值RESET之后
    arm板自启动运行应用程序时为
    RX8025T日和秒都读成32
    tornado 2.2 PPC 加入-mlong
    8 error C2664: “sscanf”:
    如何在windows上检测耳机的热
    串口接收用DMA总线空闲是开始
    K9k8G08U0A 裸机驱动复位不正
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |