USB设备检测-Windows&;Linux(FT232R)
如何在windows和linux中枚举和识别(获取pid、vid和串行)FT232R芯片。我需要: 1.在程序开始时,枚举已插入的设备 2.检测usb设备的插拔 3.获取PID、VID、串行USB设备检测-Windows&;Linux(FT232R),linux,windows,usb,Linux,Windows,Usb,如何在windows和linux中枚举和识别(获取pid、vid和串行)FT232R芯片。我需要: 1.在程序开始时,枚举已插入的设备 2.检测usb设备的插拔 3.获取PID、VID、串行 我需要在windows和linux中这样做。我知道windows和linux都有libusb,但我对USB没有太多经验。代码示例最好。您应该在Windows中使用SetupAPI来获取设备信息,如硬件id(同时包含vid和pid),并检测插拔情况。请参见此链接中的示例 要使用SetupAPI,您可以使用以
我需要在windows和linux中这样做。我知道windows和linux都有libusb,但我对USB没有太多经验。代码示例最好。您应该在Windows中使用SetupAPI来获取设备信息,如硬件id(同时包含vid和pid),并检测插拔情况。请参见此链接中的示例 要使用SetupAPI,您可以使用以下代码作为参考,并根据需要添加/修改
#include "stdafx.h"
#include <stdlib.h>
#include <Windows.h>
// Link to setapi.lib
#include <setupapi.h>
void GetDeviceInfo()
{
GUID gUSBGuid;
DWORD ClassGuidListSize = 1;
DWORD RequiredSize = NULL;
//if device shown under "USB" node in Devmgr, else see inf for classname
BOOL bres = SetupDiClassGuidsFromName((PCTSTR)"USB",
&gUSBGuid,//GUID will get populated
ClassGuidListSize,
&RequiredSize);
HDEVINFO hDevInfo = SetupDiGetClassDevs(&gUSBGuid,NULL,NULL,DIGCF_PRESENT);
if (INVALID_HANDLE_VALUE != hDevInfo)
{
BOOL bResult = FALSE;
SP_DEVICE_INTERFACE_DATA tDeviceInterfaceData;
tDeviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
for (int nMemberIndex = 0; TRUE ; nMemberIndex++)
{
SP_DEVINFO_DATA tSpDevInfoData;
tSpDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
//Get the tSpDevInfoData for the instance ID
bResult = SetupDiEnumDeviceInfo(hDevInfo,nMemberIndex,&tSpDevInfoData);
if(bResult)
{
TCHAR *szHardwareId = new TCHAR[128] ;
DWORD dwtype = REG_SZ;
SetupDiGetDeviceRegistryProperty(hDevInfo,&tSpDevInfoData,SPDRP_HARDWAREID
,&dwtype,(PBYTE szHardwareId,256,NULL);
//code to process szHardwareId
delete szHardwareId;
break;
}
}
}
}
#包括“stdafx.h”
#包括
#包括
//链接到setapi.lib
#包括
void GetDeviceInfo()
{
GUID gUSBGuid;
DWORD ClassGuidListSize=1;
DWORD RequiredSize=NULL;
//如果设备显示在Devmgr中的“USB”节点下,则请参阅inf以获取类名
BOOL-bres=SetupDiClassGuidsFromName((PCTSTR)“USB”,
&gUSBGuid,//将填充GUID
ClassGuidListSize,
&所需尺寸);
HDEVINFO HDEVINFO=SetupDiGetClassDevs(&gUSBGuid,NULL,NULL,DIGCF_PRESENT);
if(无效的句柄值!=hDevInfo)
{
BOOL-bResult=FALSE;
SP_设备_接口_数据tDeviceInterface数据;
tDeviceInterfaceData.cbSize=sizeof(SP_接口_设备_数据);
for(int-nMemberIndex=0;TRUE;nMemberIndex++)
{
SP_DEVINFO_数据TSPDevInfo数据;
tspdevinfo.cbSize=sizeof(SP_DEVINFO_数据);
//获取实例ID的tspdevinfo数据
bResult=SetupDiEnumDeviceInfo(hDevInfo、nMemberIndex和tspdevinfo数据);
if(bResult)
{
TCHAR*szHardwareId=新的TCHAR[128];
DWORD dwtype=REG_SZ;
SetupDiGetDeviceRegistrProperty(HDeInfo和TSPDeInfo数据、SPDRP_硬件ID
,&dwtype,(PBYTE szHardwareId,256,NULL);
//处理szHardwareId的代码
删除szHardwareId;
打破
}
}
}
}
我对Linux没有任何想法..:(
希望这有帮助。这将有助于“识别”部分。如何检测何时插入新的USB设备。我发布的链接“注册设备通知”exlplains WM_Devicechange通知无论何时插入或删除设备。您必须创建不可见窗口,并根据您的要求收听这些通知并采取行动。噢。对不起!读得不太好。我猜我在一个主题中发布linux和windows问题时犯了一个错误。一旦我能够测试所有内容,我将接受新年快乐