2025年2月24日 星期一 甲辰(龙)年 腊月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

获取电脑中串口名和串口ID

时间:09-15来源:作者:点击数:30

获取电脑中串口名和串口ID

枚举Windows系统上的串行端口(COM端口),并将这些端口的名称和ID(去除了"COM"前缀后的数字部分)存储到两个向量(m_vPortNameList和 m_vPortID)中。之后,它将这些端口名称添加到两个组合框(m_comb_PortList 和m_comb_ScanCodePortList)中。
  • bool CPortSetting::EnumPort()
  • {
  • //使用RegOpenKeyEx函数打开HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\注册表键,
  • //该键包含了系统上所有串行端口的配置信息。
  • HKEY hKey;
  • LPCTSTR data_Set = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
  • long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
  • if (ret0 != ERROR_SUCCESS)
  • {
  • return false;
  • }
  • const int nNameSize = 100;
  • int nNum = 0;
  • TCHAR szName[nNameSize];
  • TCHAR szPortName[nNameSize];
  • LONG Status;
  • DWORD nIndex = 0;
  • DWORD nKeyNameSize = sizeof(szName);;
  • DWORD nPortNameSize = sizeof(szPortName);
  • DWORD nType;
  • m_vPortID.clear();
  • m_vPortNameList.clear();
  • do
  • {
  • //使用RegEnumValue函数枚举该键下的所有值。每个值都代表一个串行端口的配置,
  • //其中值名通常是端口的名称(如"COM1"),值数据可能包含端口的额外配置信息(但在这个例子中未使 用)。
  • Status = RegEnumValue(hKey, nIndex++, szName, &nKeyNameSize, NULL, &nType,
  • (PUCHAR)szPortName, &nPortNameSize);
  • if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA))
  • {
  • TSTRING strPortName = szPortName;// 串口名
  • m_vPortNameList.push_back(strPortName);
  • //对于每个枚举到的项,代码将值名(即端口名称)添加到m_vPortNameList中,
  • //并去除"COM"前缀后转换为整数,添加到m_vPortID中。
  • //注意:ERROR_MORE_DATA通常表示缓冲区太小,无法容纳所有返回的数据。但在这个上下文中,
  • //它可能不是预期的错误码,因为RegEnumValue的缓冲区大小是预先设定的,并且每次循环都会重置。
  • TSTRING strPortID = strPortName.replace(strPortName.find(_T("COM")),3,_T(""));
  • int nID = _wtoi(strPortID.c_str());//串口ID
  • m_vPortID.push_back(nID);
  • nNum++;// 串口计数
  • }
  • nKeyNameSize = sizeof(szName);
  • nPortNameSize = sizeof(szPortName);
  • } while ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA));
  • RegCloseKey(hKey);
  • m_comb_PortList->RemoveAll();
  • AddComboElement(m_comb_PortList, m_vPortNameList);
  • //2023.10.25 add 扫码端口号设置
  • m_comb_ScanCodePortList->RemoveAll();
  • AddComboElement(m_comb_ScanCodePortList, m_vPortNameList);
  • return true;
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐