这篇文章讲解一下如何使用window的api获取串口名称和串口数量
#include <Windows.h>
#include <iostream>
#include <vector>
// 获取串口名称的函数
std::vector<std::wstring> GetSerialPorts() {
std::vector<std::wstring> portNames;
// 定义注册表路径
wchar_t keyName[] = L"HARDWARE\\DEVICEMAP\\SERIALCOMM";
// 打开注册表项
HKEY hKey;
LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &hKey);
// 检查是否成功打开注册表项
if (result == ERROR_SUCCESS) {
// 定义变量用于遍历注册表值
DWORD index = 0;
WCHAR valueName[256];
DWORD valueNameSize = sizeof(valueName) / sizeof(valueName[0]);
BYTE valueData[256];
DWORD valueDataSize = sizeof(valueData);
// 遍历注册表项的值
while (RegEnumValueW(hKey, index++, valueName, &valueNameSize, nullptr, nullptr, valueData, &valueDataSize) == ERROR_SUCCESS) {
// 将注册表值转换为串口名称
std::wstring portName(reinterpret_cast<WCHAR*>(valueData));
portNames.push_back(portName);
// 重置变量以便下一次迭代
valueNameSize = sizeof(valueName) / sizeof(valueName[0]);
valueDataSize = sizeof(valueData);
}
// 关闭注册表项
RegCloseKey(hKey);
} else {
// 打开注册表项失败,输出错误信息
std::cout << "Error opening registry key." << std::endl;
}
// 返回获取到的串口名称列表
return portNames;
}
int main() {
// 调用获取串口信息的函数
std::vector<std::wstring> serialPorts = GetSerialPorts();
// 输出获取到的串口信息
if (!serialPorts.empty()) {
std::cout << L"Serial Ports:" << std::endl;
for (const auto& port : serialPorts) {
std::cout << port << std::endl;
}
} else {
std::cout << L"No serial ports found." << std::endl;
}
return 0;
}
这段代码使用 Windows API 中的 RegOpenKeyExW
和 RegEnumValueW
函数来打开和遍历注册表项,具体来说是 HARDWARE\\DEVICEMAP\\SERIALCOMM
。在遍历过程中,获取了每个注册表值(即串口名称)并存储在 std::vector<std::wstring>
中。最后,输出获取到的串口信息。