LWZ123999 2015-05-21 01:45 采纳率: 0%
浏览 2827

usb cdc(通信设备类)在用vc++写上层应用程序时遇到问题?

USB写一个应用时调用SetupDiEnumDeviceInterfaces()这个函数出错.

因为是CDC通信(端口(COM和LPT))而不是HID通信, 所以用得是固定"安装类"的GUID,网上也有很多人提过这问题,但一直木有人解决, 求救呀, 搞了很久很久了...

 GUID guidHID = {0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18};     //安装类GUID是在inf驱动文件上的GUID
    //HidD_GetHidGuid( &guidHID );    //因为不是HID设备,所以不用这个来获得GUID, 而是用上面这个固定GUID

    HDEVINFO hDevInfo = SetupDiGetClassDevs( &guidHID, NULL, 0, DIGCF_PRESENT );  //由于是"安装类的GUID"而非"接口类GUID", 所以在最后一个参数没加DIGCF_DEVICEINTERFACE

    if( INVALID_HANDLE_VALUE != hDevInfo )   //调用成功返回文件句柄, 如果调用失败返回INVALID_HANDLE_VALUE
    {
        SP_DEVICE_INTERFACE_DATA strtInterfaceData = { sizeof(SP_DEVICE_INTERFACE_DATA) };
        // 查找USB设备接口
        for( DWORD index=0; SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,index,&strtInterfaceData); ++index )   //程序在这一步出错, 枚举老返回0,导致没法进行下一步了
        {
            char buf[1000];
            SP_DEVICE_INTERFACE_DETAIL_DATA& strtDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA&)buf[0];
            strtDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
            // 若找到了设备,则读取设备路径名
            if( SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,&strtDetailData,_countof(buf),NULL,NULL) )
            {
                _tprintf( _T("[%d] path: %s\n"), index, strtDetailData.DevicePath );   //设备路径名

                //用CreateFile打开或创建设备
                HANDLE hUsb = CreateFile( strtDetailData.DevicePath, GENERIC_READ|GENERIC_WRITE//0
                    , FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
                if( INVALID_HANDLE_VALUE != hUsb )   //调用成功返回文件句柄, 如果调用失败返回INVALID_HANDLE_VALUE
                {
                    // 查询设备标识
                    HIDD_ATTRIBUTES strtAttrib = { sizeof(HIDD_ATTRIBUTES) };
                    //用HidD_GetAttributes获得特定HID属性
                    if( HidD_GetAttributes(hUsb,&strtAttrib) )
                    {
                        _tprintf( _T("VendorID : %hX\n"), strtAttrib.VendorID );
                        _tprintf( _T("ProductID: %hX\n"), strtAttrib.ProductID );
                        _tprintf( _T("VerNumber: %hX\n"), strtAttrib.VersionNumber );
                        if(strtAttrib.VendorID==0x3006 && strtAttrib.ProductID==0x1977)
                        {
                            _tprintf( _T("Find:VendorID-0x3006, ProductID-0x1977\n")); 
                            COMSTAT ComStat;
                            DWORD dwErrorFlags;
                            //ClearCommError(hUsb,&dwErrorFlags,&ComStat);  //读写设备之前应先调用这个函数清除错误标志

                            BYTE pBuffer[8] = {0};  
                            if( DeviceWrite(hUsb,pBuffer, 7)  )
                            {
                                for(int i=0;i<8;i++)
                                {
                                    _tprintf( _T("Read: %02X"),pBuffer[i]);
                                    if(((i+1)%16)==0)
                                    {
                                        _tprintf( _T("\n")); 
                                    }
                                }
                            }
                            else
                            {
                                _tprintf( _T("Read error"));
                            }
                        }

                    }
                    else
                        ShowError();

                    //释放资源
                    CloseHandle( hUsb );
                }
                else
                    ShowError();
            }
            else
                ShowError();
        }
        if( GetLastError() != ERROR_NO_MORE_ITEMS )
            ShowError();

        SetupDiDestroyDeviceInfoList( hDevInfo );
    }
    else
        ShowError();
  • 写回答

3条回答 默认 最新

  • zzkjliu 2015-05-21 02:08
    关注

    这种问题的解决如果对你来说有相当的经济价值,技术就不是问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题