21xrx.com
2024-12-22 21:36:55 Sunday
登录
文章检索 我的文章 写文章
C++获取USB设备的COM口
2023-07-08 14:45:12 深夜i     --     --
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的相关文档进行深入学习,来提高程序的稳定性和可靠性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复