henry__
驱动牛犊
驱动牛犊
  • 注册日期2008-01-08
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2044回复:3

USB 通信问题,期盼高人指点

楼主#
更多 发布于:2008-01-08 11:34
想做一个很简单的,但是能通用的USB读写程序。我想如果USB设备能在PC被认出,就可以通信。
目前的办法是HidD_GetHidGuid ,SetupDiGetClassDevs ,SetupDiEnumDeviceInterfaces 等来获取USB驱动接口信息,然后createfile 等来操作文件接口。

目前问题是不能获得设备。SetupDiEnumDeviceInterfaces  就失败了.
开发环境VC6.0/2003都试了,DDK for XP 也安装且.h .lib 都引入了。反正就是不行。
代码是从网络上荡下来的VC6.0 的,
please refer below:
    // TODO: Add your control notification handler code here
    m_strLog.Empty();

    m_strLog = _T("正在查找系统中HID类的GUID标识...\r\n");
    SetDlgItemText(IDC_EDIT_REPORT,m_strLog);

    // 查找本系统中HID类的GUID标识
    GUID guidHID;
    HidD_GetHidGuid(&guidHID);
    m_strLog += _T("HID类的GUID标识为\r\n");

    CString strShow;
    strShow.Format("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n",
        guidHID.Data1,guidHID.Data2,guidHID.Data3,guidHID.Data4[0],
        guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],guidHID.Data4[4],
        guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]);

    m_strLog += strShow;
    SetDlgItemText(IDC_EDIT_REPORT,m_strLog);

    // 准备查找符合HID规范的USB设备
    HDEVINFO hDevInfo =SetupDiGetClassDevs(&guidHID,NULL,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
    
    UINT nIndex = 0;
    m_strLog += _T("正在查找可用的USB设备...\r\n");
    SetDlgItemText(IDC_EDIT_REPORT,m_strLog);

    // 查找USB设备接口
    SP_DEVICE_INTERFACE_DATA strtInterfaceData;
    //henry add
    strtInterfaceData.cbSize=sizeof(strtInterfaceData);
    BOOL bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,0,
        &strtInterfaceData);

    if (!bSuccess)
    {
                                          //总是从这里进来,俺很郁闷
        m_strLog += _T("抱歉,未找到可用的USB设备");
        SetupDiDestroyDeviceInfoList(hDevInfo);
        SetDlgItemText(IDC_EDIT_REPORT,m_strLog);
        return;
    }

    // 若找到了设备,则读取设备路径名
    SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
     strtDetailData.cbSize=sizeof(strtDetailData);
    if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
        &strtDetailData,sizeof(strtDetailData),NULL,NULL))
    {
        AfxMessageBox(_T("查找设备路径时出错!"));
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return;
    }

    // 找到了设备路径
    m_strPath = strtDetailData.DevicePath;
    strShow.Format("可以通过路径%s访问设备\r\n",m_strPath);
    m_strLog += strShow;
    SetDlgItemText(IDC_EDIT_REPORT,m_strLog);

    // 开放与设备的通信
    HANDLE hCom = CreateFile(m_strPath,GENERIC_READ | GENERIC_WRITE,
        0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hCom = INVALID_HANDLE_VALUE)
    {
        AfxMessageBox(_T("无法打开通信端口"));
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return;
    }

    // 查询设备标识
    HIDD_ATTRIBUTES strtAttrib;
    m_strPath += _T("正在读取设备的标识...\r\n");
    SetDlgItemText(IDC_EDIT_REPORT,m_strPath);

    if (!HidD_GetAttributes(hCom,&strtAttrib))
    {
        AfxMessageBox(_T("查询设备状态时出错!"));
        CloseHandle(hCom);
        SetupDiDestroyDeviceInfoList(hDevInfo);
    }

    // 将有关该设备的标识显示出来
    m_strPath += _T("已读取,见右边所示\r\n");
    SetDlgItemText(IDC_EDIT_REPORT,m_strPath);

    // 显示供应商标识
    strShow.Format("0x%x",strtAttrib.VendorID);
    SetDlgItemText(IDC_ID_VENDOR,strShow);

    // 显示产品标识
    strShow.Format("0x%x",strtAttrib.ProductID);
    SetDlgItemText(IDC_ID_PRODUCT,strShow);

    // 显示产品版本号
    strShow.Format("%d",strtAttrib.VersionNumber);
    SetDlgItemText(IDC_ID_VERSION,strShow);

    // 释放资源
    CloseHandle(hCom);
    SetupDiDestroyDeviceInfoList(hDevInfo);
henry__
驱动牛犊
驱动牛犊
  • 注册日期2008-01-08
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-08 16:17
不用DDK,直接用Windows  dll 也是找不到,估计哪儿有点Bug,有哪位出来指点阿。。。。
henry__
驱动牛犊
驱动牛犊
  • 注册日期2008-01-08
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-08 19:48
问题似乎过于简单,没有人过问阿,哈哈
henry__
驱动牛犊
驱动牛犊
  • 注册日期2008-01-08
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-09 15:10
哈哈,这里似乎没有人来过,唉,目前基本对了,就是获取属性时有一点点问题。  就此别过这个太水网站。
游客

返回顶部