C++监控已经打开的串口
时间: 2023-11-14 13:24:44 浏览: 143
c# 串口监控程序
3星 · 编辑精心推荐
可以使用Windows API函数 `CreateFile` 和 `SetupAPI` 库中的函数来监控已经打开的串口。
首先,使用 `SetupAPI` 库中的函数 `SetupDiGetClassDevs` 枚举所有串口设备。然后,使用 `CreateFile` 函数打开每个串口设备。如果 `CreateFile` 函数返回 `INVALID_HANDLE_VALUE`,则表示该串口设备已经被其他进程打开。
以下是示例代码:
```c++
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include <string>
#include <vector>
#pragma comment(lib, "setupapi")
std::vector<std::string> GetOpenSerialPorts()
{
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
return std::vector<std::string>();
}
std::vector<std::string> openPorts;
SP_DEVINFO_DATA devInfoData;
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData); i++)
{
HKEY hKey = SetupDiOpenDevRegKey(hDevInfo, &devInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
if (hKey != INVALID_HANDLE_VALUE)
{
DWORD type;
DWORD size = 0;
RegQueryValueEx(hKey, "PortName", NULL, &type, NULL, &size);
if (size > 0)
{
std::vector<char> buffer(size);
RegQueryValueEx(hKey, "PortName", NULL, &type, (LPBYTE)&buffer[0], &size);
std::string portName = std::string(buffer.begin(), buffer.end() - 1);
HANDLE hPort = CreateFile(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hPort != INVALID_HANDLE_VALUE)
{
CloseHandle(hPort);
}
else
{
openPorts.push_back(portName);
}
}
RegCloseKey(hKey);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return openPorts;
}
```
该函数返回一个字符串向量,其中包含所有已经被其他进程打开的串口名称。
阅读全文