iodehua
驱动牛犊
驱动牛犊
  • 注册日期2008-02-25
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1082回复:0

【请教】读取HID设备数据的应用程序

楼主#
更多 发布于:2008-02-28 17:07
最近刚做好了固件,端点1实现中断传输,使能了in和out。用bus hound测试了,能获得固件发送的report,固件也能收到out事务的数据。现在想用vc做个应用程序实现数据的读写。
参考了网上的程序,把我写的程序贴出来,请各位帮我看看出啥问题了,可以打开设备获得设备的路径等信息了,但是用readfile读数据一直得不到真。
程序如下


{

    
    GUID myhidguid;
    CString strShow,strShow1;

    
    HidD_GetHidGuid(&myhidguid);

        HDEVINFO hDevInfo = SetupDiGetClassDevs(&myhidguid,NULL,0,
        DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );
    
    if(hDevInfo==INVALID_HANDLE_VALUE)
    {
        strShow="查找USB设备出错!\r\n";
        ShowMessage(strShow);
        return;
    }
    else
    {
        strShow="找到USB设备.\r\n";
        ShowMessage(strShow);
    }
        UINT nIndex = 0;
    strShow= "正在查找可用的USB设备...\r\n";
    ShowMessage(strShow);

    SP_DEVICE_INTERFACE_DATA strtInterfaceData;

    strtInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
    BOOL bSuccess ;
    DWORD index=0;
    CString temp;
    for(int i=0;i<10;i++)
    {
    bSuccess= SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&myhidguid,index,
        &strtInterfaceData);
    if (!bSuccess)
    {    
        if(i==0)
        {
        strShow="查找USB设备出错!\r\n";
        ShowMessage(strShow);
        }
        
        break;
    }
    else
    {
        if(strtInterfaceData.Flags==SPINT_ACTIVE )
        {
            
            strShow1="%d 连接 \r\n";
            temp.Format(strShow1,index+1);
            ShowMessage(temp);
            //ShowMore(hDevInfo,strtInterfaceData);
        
        PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;

    DWORD strSzie=0,requiesize=0;
    SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,NULL,0,&strSzie,NULL);

    requiesize=strSzie;
    strtDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiesize);
    strtDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

    SP_DEVINFO_DATA infodata;
    infodata.cbSize=sizeof(SP_DEVINFO_DATA);
    if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
        strtDetailData,strSzie,&requiesize,NULL))
    {
        strShow="查找设备路径时出错!";
        ShowMessage(strShow);
        SetupDiDestroyDeviceInfoList(hDevInfo);
        free(strtDetailData);
        return;
    }
    
    strShow1="设备路径:\r\n%s\r\n";
    strShow.Format(strShow1,strtDetailData->DevicePath);
    ShowMessage(strShow);
    strShow="打开通信端口....\r\n";
    ShowMessage(strShow);
        HANDLE hCom = CreateFile (
                  strtDetailData->DevicePath,
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL,
                  OPEN_EXISTING, 0,
                  NULL);
    if (hCom == INVALID_HANDLE_VALUE)
    {
        strShow="无法打开通信端口。不能读取设备信息!(设备连接可能不正确?)\r\n";
        ShowMessage(strShow);
        SetupDiDestroyDeviceInfoList(hDevInfo);
        free(strtDetailData);
        return;
    }
    
        strShow="打开通信端口成功!\r\n";
        ShowMessage(strShow);
        HIDD_ATTRIBUTES strtAttrib;
         strShow="正在读取设备的标识...\r\n";
        ShowMessage(strShow);

    strtAttrib.Size=sizeof(HIDD_ATTRIBUTES);
    if (!HidD_GetAttributes(hCom,&strtAttrib))
    {
        strShow="查询设备状态时出错!";
        ShowMessage(strShow);
        CloseHandle(hCom);

        free(strtDetailData);
        return;    
    }


    unsigned char reportbuffer[32];
    DWORD reeee=8;
    DWORD reee;
    char success=0;
    success=ReadFile(hCom,reportbuffer,reeee,&reee,NULL));
    
        }
    }
    index++;

    }
    strShow1="总共%d个设备连接";
    temp.Format(strShow1,index);
    ShowMessage(temp);

}
游客

返回顶部