C++ 获取COM口 pid vid
时间: 2024-12-04 20:25:32 浏览: 29
在C++中,获取COM设备(如串口PID和VID,即产品ID和供应商ID)通常涉及到硬件访问或者底层驱动程序编程,因为这需要直接操作系统底层的设备信息。如果你正在编写Windows应用,可以使用Win32 API函数来读取设备的详细属性。
首先,你需要包含`<windows.h>`头文件,并确保有足够的权限访问设备:
```cpp
#include <windows.h>
#include <SetupAPI.h> // 引入用于设备管理的库
// 宏常量定义
#define SPDRP_ID_VENDOR 0x04
#define SPDRP_ID_PRODUCT 0x05
// 设备路径示例 (假设是从设备管理器复制的)
std::string devicePath = "\\\\.\\COM1";
// 获取设备信息的结构体
struct tagSP_DEVINFO_DATA {
DWORD cbSize;
TCHAR DeviceInstanceId[DEVINST_NAME_SIZE];
TCHAR FriendlyName[MAX_PATH];
DWORD ClassGuid;
ULONG DeviceType;
DWORD DevInstId;
};
void getCOMPortPIDVID(const std::string& devicePath) {
HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, L"SERIALCOMM", NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
// 处理错误...
return;
}
SP_DEVINFO_DATA devInfoData = { sizeof(SP_DEVINFO_DATA), {}, {}, 0, 0, 0 };
SPDeviceInterfaceDetailData details = { sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA), {} };
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData); ++i) {
if (lstrcmpA(devInfoData.DeviceInstanceId, devicePath.c_str()) == 0) {
if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, &details, 0, NULL, NULL)) {
PCTSTR vendorString = (PCTSTR)SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_ID_VENDOR, NULL, NULL, 0, NULL);
PCTSTR productString = (PCTSTR)SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_ID_PRODUCT, NULL, NULL, 0, NULL);
DWORD pid = _wtoi(productString); // 将产品ID转换为整数(这里假设为文本)
DWORD vid = _wtoi(vendorString); // 同样将供应商ID转换为整数
// 输出结果或做其他处理
wprintf(L"Product ID: %d\nVendor ID: %d\n", pid, vid);
CoTaskMemFree(details.cbSize);
CoTaskMemFree(details.pDeviceInterfaceDetail);
}
else {
// 处理错误...
}
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
}
```
这个函数会遍历所有当前存在的串口设备,找到指定设备路径的那一个,并从注册表中读取PID和VID。请注意,在实际使用中,错误处理是非常重要的。
阅读全文