21xrx.com
2025-03-21 23:40:22 Friday
文章检索 我的文章 写文章
C++获取USB设备的COM口
2023-07-08 14:45:12 深夜i     48     0
C++ USB设备 COM口 获取 编程

在物联网时代,我们经常需要与各种传感器或设备进行通信。其中,USB设备是应用最广泛的一种,因为它们易于使用和安装。在C++程序中,我们可以通过获取USB设备的COM口,来实现与USB设备的通信。

接下来,我们将以Windows系统为例,介绍如何在C++程序中获取USB设备的COM口。

首先,我们需要获取USB设备的设备ID。每个USB设备都有一个唯一的设备ID,可以通过设备管理器获取。在设备管理器中,找到你要连接的USB设备,右键单击设备名称并选择“属性”,在“详细信息”下拉列表中选择“硬件ID”即可看到设备的唯一ID。

接下来,我们需要使用Windows API函数来搜索系统中的所有串行设备,并找到与USB设备ID匹配的设备。Windows API中,提供了一个Serial Communications(串行通信)类库,它包含了用于获取串行设备信息的函数。其中最常用的函数是EnumPorts(),该函数可以列举出系统中所有可用的串口信息。

在使用EnumPorts()函数之前,我们需要先定义一个结构体COMMPROP,如下所示:

typedef struct _COMMPROP {
WORD wPacketLength;
WORD wPacketVersion;
DWORD dwServiceMask;
DWORD dwReserved1;
DWORD dwMaxTxQueue;
DWORD dwMaxRxQueue;
DWORD dwMaxBaud;
DWORD dwProvSubType;
DWORD dwProvCapabilities;
DWORD dwSettableParams;
DWORD dwSettableBaud;
WORD wSettableData;
WORD wSettableStopParity;
DWORD dwCurrentTxQueue;
DWORD dwCurrentRxQueue;
DWORD dwProvSpec1;
DWORD dwProvSpec2;
WCHAR wcProvChar[1];
} COMMPROP, *LPCOMMPROP;

接下来,我们可以使用以下代码片段来获取所有串口列表:

DWORD cbNeeded = 0;
//获取系统中所有串行设备信息
if(EnumPorts( NULL, 2, NULL, 0, &cbNeeded, NULL ) == FALSE) {
LPCWSTR errMsg = L"";
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
 LPWSTR pPorts = new wchar_t[cbNeeded];
 if(EnumPorts( NULL, 2, pPorts, cbNeeded, &cbNeeded, NULL ) == TRUE) {
  //遍历所有串口
  LPPORT_INFO_2 pPortInfo = NULL;
  DWORD dwCount;
  DWORD dwTotal = 0;
  if(EnumPorts( NULL, 2, (LPBYTE) pPorts, cbNeeded, &dwCount, &dwTotal ) == TRUE) {
  pPortInfo = (LPPORT_INFO_2) pPorts;
  for(DWORD i=0; i < dwCount; i++) {
   printf("%s\n", pPortInfo[i].pPortName);
  }
  }
 }
 delete[] pPorts;
} else {
 printf("EnumPorts() failed. %d\n", GetLastError());
}
}

以上代码中,我们使用了EnumPorts()函数来获取所有的串行设备信息,并遍历了串口列表并打印出所有串口的名称。

对于每个串口,我们需要与USB设备ID进行匹配来获取其对应的COM口号。对于匹配过程,我们可以使用以下代码片段:

HKEY hkey;
//匹配USB设备ID
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\DeviceClasses\\{86e0d1e0-8089-11d0-9ce4-08003e301f73}", 0, KEY_READ, &hkey) != ERROR_SUCCESS) {
printf("RegOpenKeyEx() failed. %d\n", GetLastError());
return false;
}
DWORD dwIndex = 0;
char szDeviceID[MAX_PATH+1] = "";
DWORD dwLength = sizeof(szDeviceID);
while(ERROR_SUCCESS == RegEnumKeyEx(hkey, dwIndex++, szDeviceID, &dwLength, NULL, NULL, NULL, NULL))
{
  key = "SYSTEM\\CurrentControlSet\\Enum\\" + string(szDeviceID);
  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key.c_str() , 0, KEY_READ, &hEnumKey) == ERROR_SUCCESS){
    if(RegQueryValueEx(hEnumKey, "ClassGUID", NULL, NULL, (LPBYTE) szClassGUID, &dwLength) == ERROR_SUCCESS){
      if(_stricmp(szClassGUID, "{d25a9310-4a4b-11d4-9765-00c04fda7b7c}") == 0){ //检查ID是否匹配
        if(RegQueryValueEx(hEnumKey, "PortName", NULL, &dwType, (LPBYTE)szPortName, &dwSize) == ERROR_SUCCESS){
          //找到对应的COM口了
          printf("Found USB device on COM%s\n", szPortName);
          return true;
        }
      }
    }
  }
}
RegCloseKey(hImpactKey);

最后,我们可以通过以上代码得到USB设备的COM口。通过COM口,我们就可以向USB设备发送数据和接收数据了。

总之,获取USB设备的COM口是实现C++程序与USB设备通信的基础。在实际应用中,我们需要注意匹配串口和USB设备ID,以免出现错误。同时,我们也需要注意于Windows API的相关文档进行深入学习,来提高程序的稳定性和可靠性。

  
  

评论区

请求出错了