winapi - 如何获取 Win32 中可用串行端口的列表?

标签 winapi serial-port

我有一些遗留代码,通过调用 EnumPorts() 提供 PC 上可用 COM 端口的列表。函数,然后过滤以“COM”开头的端口名称。

出于测试目的,如果我可以将此代码与 com0com 之类的代码一起使用,那将非常有用。 ,它提供了成对的虚拟 COM 端口,它们作为空调制解调器循环在一起。

但是,EnumPorts() 函数找不到 com0com 端口(即使没有过滤“COM”)。 super 终端和 SysInternals PortMon 都可以看到它们,所以我确定它安装正确。

那么还有其他一些 Win32 函数可以提供可用串行端口的明确列表吗?

最佳答案

EnumSerialPorts v1.20 Nick D 建议使用种不同的方法来列出串行端口!我们当然不缺少选择,尽管结果似乎有所不同。

为了省去其他人的麻烦,我将在这里列出它们,并指出它们在我的 PC (XP Pro SP2) 上成功找到 com0com 端口:

  1. CreateFile("COM"+ 1->255) 根据 Wael Dalloul 的建议
    ✔ 找到 com0com 端口,花费了 234 毫秒。

  2. QueryDosDevice()
    ✔ 找到 com0com 端口,花费了 0 毫秒。

  3. GetDefaultCommConfig("COM"+ 1->255)
    ✔ 找到 com0com 端口,花费了 235 毫秒。

  4. “SetupAPI1”使用对 SETUPAPI.DLL 的调用
    ✔ 找到 com0com 端口,还报告“友好名称”,花费了 15 毫秒。

  5. “SetupAPI2”使用对 SETUPAPI.DLL 的调用
    ✘ 未找到 com0com 端口,报告“友好名称”,耗时 32 毫秒。

  6. EnumPorts()
    ✘ 报告一些非COM端口,没有找到com0com端口,花了15ms。

  7. 使用 WMI 调用
    ✔ 找到 com0com 端口,还报告“友好名称”,花费了 47 毫秒。

  8. 使用 MSPORTS.DLL 调用的 COM 数据库
    ✔/✘ 报告了一些非 COM 端口,找到了 com0com 端口,花费了 16 毫秒。

  9. 迭代注册表项 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
    ✔ 找到 com0com 端口,花费了 0 毫秒。这显然就是SysInternals PortMon用途。

根据这些结果,我认为 WMI 方法可能最适合我的要求,因为它相对较快,而且它还提供了友好的名称(例如“通信端口 (COM1)”、“com0com - 串行端口模拟器”) .

关于winapi - 如何获取 Win32 中可用串行端口的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1388871/

相关文章:

c++ - Arduino Serial 是在哪里创建的?

c# - 在 C# 中访问 COM10 或更高端口

winapi - AMD64 jmp (FF25) 之前 REX.w 前缀的含义

windows - Windows 的 "Safely Remove Hardware"对话框如何获取 "foreground love"?

c - NetLocalGroupAddMembers 返回成功,但未按预期工作

c++ - 从串行端口读取而不从缓冲区中删除(linux)

c++ - Qt Creator 如何采集外部串口设备的实时数据?

C串口程序使用键盘和显示器代替串口/dev/ttyUSBX

c++ - 如何查询正在运行的进程的参数列表? ( window ,C++)

c - 什么是特权指令?