我正在做一 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)可能是什么样的问题所致呢? 还请各位前辈多多指点 谢谢
#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)可能是什么样的问题所致呢? 还请各位前辈多多指点 谢谢
如果不是标准的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就行。
至于程序怎么实现,我只是个超级新手,还望各位大侠能多多指教……
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 的值
应该是头文件包含的问题,
应该是这样包含的:extern "C"
{
#include "hidsdi.h"
#include "setupapi.h"
}
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;
}
}
}
那2个地方都是必须的步骤来的(不应该注释) // 从操作系统获取HIDs 的GUID
// HidD_GetHidGuid(&hidGuid);
// HidD_GetAttributes(HIDDevice,&Attributes); //////////////////////////////////////////
//开头的定于
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;
}
{
AfxMessageBox(_T("查询设备状态时出错!"));
//return 0;
} 就是这步 返回 false
TMD csdn为什么不给我上传图片了HidD_GetAttributes(HIDDevice,&Attributes)) ;在这里 始终无法获得 attribute 的 值
=======
不过Createfile 的第一参数比较难获取。
==============
是从根开始朝下枚举 可以获取到所有的设备。
似乎优盘之类的不可以。(忘记了)
如果不是,那就是用CreateFile来查询吧,但是这个查询也需要厂商提供给你命令代码的。
===========
你可以看下代码 ,他的不仅仅是枚举HID设备的.....
不要只看文章不看代码。
==========================
http://www.vckbase.com/document/viewdoc/?id=1282一、枚举USB设备
二、枚举HID设备