我正在做一 PC 端 通过USB接口和 DE3 board 的通讯程序请问该如何对USB设备进行判断?比如PC连有多个USB设备,从中选取所需的那个在网上找到的USB通讯的范例中,相关的地方只有
#define UsbTestDevice_CLASS_GUID \
{ 0x36fc9e60, 0xc465, 0x11cf, { 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 } }没有 VendorID  或者 ProductID 一类的,这种程序是不是只能用于通用U盘一类,windows自带有驱动的设备的通信?还有就是
1>TestUsb5Dlg.obj : error LNK2019: unresolved external symbol "unsigned char __stdcall HidD_GetAttributes(void *,struct _HIDD_ATTRIBUTES *)" (?HidD_GetAttributes@@YGEPAXPAU_HIDD_ATTRIBUTES@@@Z) referenced in function "bool __cdecl InitUSB(void)" (?InitUSB@@YA_NXZ)
1>TestUsb5Dlg.obj : error LNK2019: unresolved external symbol "void __stdcall HidD_GetHidGuid(struct _GUID *)" (?HidD_GetHidGuid@@YGXPAU_GUID@@@Z) referenced in function "bool __cdecl InitUSB(void)" (?InitUSB@@YA_NXZ)可能是什么样的问题所致呢?  还请各位前辈多多指点 谢谢

解决方案 »

  1.   

    你报的错误应该是缺了lib了,自己在工程属性的link里面设置一下input项。
      

  2.   

    修改了input 还是有问题inoput 这里只能是一个*.lib file 吗? setupapi.lib;hidparse.lib 好像就是不行
      

  3.   

    dll才是真正包含资源的地方吧,所以添加LIB是不是要对应的dll才可以呀,楼主试试
      

  4.   

    之前我也在做USB这块,不过其他事一直耽搁,现在有点遗忘了。希望下面的回答对你有点帮助:
    如果不是标准的USB设备,那么就需要驱动的支持,所以你在连接设备的时候WINDOWNS会提示发现新硬件,要求安装驱动程序,这时候就系统会寻找有关的INF文件并且安装驱动,而如果是自定义的USB那么就需要自己根据需要重新编写对应的INF,INF文件里头有一项,例如:
    ;[5]
    [USB_Install.HW]
    AddReg=Dev_AddReg[Dev_AddReg]
    HKR,,DeviceInterfaceGUIDs,0x10000,"{4bee8aea-e92e-496a-9418-874a09204a78}"
    你在程序根据GUID进行查询就可以找到相应的USB设备,因为每个自定义的USB设备有自己唯一的GUID。
    至于你说的VID,PID是在INF文件里头已经包含了,因此在(PC)应用程序上只需要指明你所要寻找设备的GUID就行。
    至于程序怎么实现,我只是个超级新手,还望各位大侠能多多指教……
      

  5.   

    多谢LS各位朋友的回复 
    my_dreamest_gigi 可是我没有找到 设备唯一的 GUID 值在使用winDDk 里面的 USB View 检测 GUID 时 会有两个值
    要是使用 {36FC9E60-C465-11CF-8056-444553540000}(*.inf文件里面也是这个值)无法找到任何USB设备,使用{f18a0e88-c30c-11d0-8815-00a0c906bed8} 变可以找到 但是到
    HidD_GetAttributes(HIDDevice,&Attributes);  //////////////////////////////////////////
      
                                
                              if   ((Attributes.VendorID   ==   VendorID)   && (Attributes.ProductID   ==   ProductID))   
                              {   
        
                                      //   找到了匹配的Vendor   ID   和   Product   ID的HID设备   
                                      //   建立ReadHIDDevice设备的句柄以便读取信息   
        
                                      ReadHIDDevice=CreateFile(ClassDeviceData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);   
                                      free(ClassDeviceData);   
                                      SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);   
        
                                      //初始化成功   
                                      return   TRUE;
                              }   却始终无法得到 Attributes.VendorID Attributes.ProductID 的值
      

  6.   

    刚刚发现 HidD_GetAttributes 只可用于 HID 设备,所以我的这个应该不算但如果是这样,Attributes.VendorID Attributes.ProductID 就没法查询了还有没有什么其他语句可以查询 VID 和 PID 吗?
      

  7.   

    看你的设备有没有提供读取VID和PID的命令吧
      

  8.   

    另外 关于你的编译错误,
    应该是头文件包含的问题,
    应该是这样包含的:extern "C"
    {
    #include "hidsdi.h"
    #include "setupapi.h"
    }
      

  9.   

    谢谢LS的回复  这个问题已经解决了不知道通常情况下 PC端通过USB控制其他设备的程序识别都是那几个步骤 。 谢谢附上我现在有的部分
    bool   InitUSB()   
      {   
                      
      char szTraceBuf[256];
      char dwIndex[256];
      VendorID          =   0x046D;     // products ID  and Vendor Id of  USB
              ProductID         =   0xC016;   
        
              //   查找设备   
              //   本例程使用HID设备的API,它查找HID设备列表,找出与Vendor   ID   和   Product   ID匹配的设备   
                
              ClassDeviceData               =NULL;   
              
              deviceInfoData.cbSize         =sizeof(deviceInfoData);   
        
              //   从操作系统获取HIDs   的GUID   
           //   HidD_GetHidGuid(&hidGuid);  
                
              //   获取所有HIDs的设备信息   
     AllHIDDeviceInfo=SetupDiGetClassDevs(&hidGuid,NULL,NULL,(DIGCF_PRESENT|DIGCF_INTERFACEDEVICE));   
                        
             /*
      if(!AllHIDDeviceInfo)   
      {   
     AfxMessageBox("Couldn't   get   handle   for   HID   devices");   
     return 0;   
       }   
     *///////////////////////////////////
      
      
      HIDCounter=0;   
                      while   (TRUE)   
              {   
        
                      //   这个API将发现的设备信息写入   deviceInfoData   
                      //   HIDCounter   允许这个API重复调用所有HID设备   
                      //   如果API调用返回0,没有更多的HID设备发现    ////////THIS ONE IS USED TILL ALL DEVICES ARE FOUNDED
                      if   (!SetupDiEnumDeviceInterfaces(AllHIDDeviceInfo,NULL,&hidGuid,HIDCounter,&deviceInfoData))   
                      {   
                              //   没有发现与Vendor   ID   和   Product   ID匹配的HID设备   
                                
                              SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo); 
        
      
      sprintf(szTraceBuf, "SetupDiEnumDeviceInterfaces failed GetLastError() returns: 0x%x\n", GetLastError());
      OutputDebugString(szTraceBuf);
      printf("SetupDiEnumDeviceInterfaces failed GetLastError() returns: 0x%x\n", GetLastError());
       return   FALSE;   
    ////////////////////////////////////////////////                  }   
                      else     
                      {   
                
                              //   发现一个HID设备,获取设备的详细信息   
                              //   第一次调用SetupDiGetDeviceInterfaceDetail得到ClassDeviceData   
                              //   的大小,但返回错误   
        
                              SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&deviceInfoData,NULL,0,&requiredLength,NULL);   
                                        
                              neededLength  = requiredLength;   
                              ClassDeviceData            = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(neededLength);   
                              ClassDeviceData->cbSize  = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);      
                              //第二次调用SetupDiGetDeviceInterfaceDetail     
                              //   使用   合适的neededLength.   
                              if   (!SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&deviceInfoData,ClassDeviceData,neededLength,&requiredLength,NULL))   
                              {   
                                      free(ClassDeviceData);   
                                      SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);           
                                      return   FALSE;   
                              }   
        
                              //   建立HID设备的句柄   
      HIDDevice=CreateFile(ClassDeviceData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);   
        
                              //   获取   attributes   以便得到Vendor   ID   和   Product   ID   
                        

                             
      if(HIDDevice == INVALID_HANDLE_VALUE)
      return 0;
      
    //   HidD_GetAttributes(HIDDevice,&Attributes);  //////////////////////////////////////////

      Attributes.Size= sizeof(Attributes);

      if (!HidD_GetAttributes(HIDDevice,&Attributes)) 
      { 


    AfxMessageBox(_T("查询设备状态时出错!"));
    //return 0;
       } 
                                
                              if   ((Attributes.VendorID   ==   VendorID)   && (Attributes.ProductID   ==   ProductID))   
                              {   
        
                                      //   找到了匹配的Vendor   ID   和   Product   ID的HID设备   
                                      //   建立ReadHIDDevice设备的句柄以便读取信息   
        
                                      ReadHIDDevice=CreateFile(ClassDeviceData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);   
                                      free(ClassDeviceData);   
                                      SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);   
        
                                      //初始化成功   
                                      return   TRUE;
                              }   
                              else   
                              {   
                                      CloseHandle(HIDDevice);    

                              }   
                              free(ClassDeviceData);   
                              HIDCounter   =   HIDCounter+1;   
                      }   
              }  
      }   
      

  10.   

    上面的代码 有两个地方怎么注释掉了?
    那2个地方都是必须的步骤来的(不应该注释)          //   从操作系统获取HIDs   的GUID   
           //   HidD_GetHidGuid(&hidGuid);  
    //          HidD_GetAttributes(HIDDevice,&Attributes);  //////////////////////////////////////////
      

  11.   

    回LS的大大不好意思  前面加了相关的部分  所以这里就注释掉了
    //开头的定于
    static /*const*/ GUID hidGuid ={ 0xf18a0e88, 0xc30c, 0x11d0, { 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8 } };
     //          HidD_GetAttributes(HIDDevice,&Attributes);  =》 
     if (!HidD_GetAttributes(HIDDevice,&Attributes)) 
                                      { 
                                        
                                        
                                        AfxMessageBox(_T("查询设备状态时出错!"));
                                        //return 0;
                                       } 
      

  12.   

    if (!HidD_GetAttributes(HIDDevice,&Attributes)) 

                                        
        AfxMessageBox(_T("查询设备状态时出错!"));
        //return 0;
    } 就是这步 返回 false
    TMD csdn为什么不给我上传图片了HidD_GetAttributes(HIDDevice,&Attributes)) ;在这里 始终无法获得 attribute 的 值
      

  13.   

    CreateFile  DeviceIoControl可以获取PID  VID(利用不同的控制码)
    =======
    不过Createfile 的第一参数比较难获取。
      

  14.   

    还有就是VCKBASE上面有一个枚举USB设备的程序可以借鉴一下。
    ==============
    是从根开始朝下枚举  可以获取到所有的设备。
    似乎优盘之类的不可以。(忘记了)
      

  15.   

    估计问题就是出在 我的设备不是 HID 设备LS说的那个我看了 也是用于 HID 设备的 :]
      

  16.   

    你要看设备厂商怎么说啊,应该有相关的说明文档的,是不是HID设备类型应该联系厂商吧。
    如果不是,那就是用CreateFile来查询吧,但是这个查询也需要厂商提供给你命令代码的。
      

  17.   

    估计问题就是出在 我的设备不是 HID 设备LS说的那个我看了 也是用于 HID 设备的 :]
    ===========
    你可以看下代码 ,他的不仅仅是枚举HID设备的.....
    不要只看文章不看代码。
    ==========================
    http://www.vckbase.com/document/viewdoc/?id=1282一、枚举USB设备
    二、枚举HID设备