我有一些遗留代码,通过调用 EnumPorts()
提供 PC 上可用 COM 端口的列表。函数,然后过滤以“COM”开头的端口名称。
出于测试目的,如果我可以将此代码与 com0com 之类的代码一起使用,那将非常有用。 ,它提供了成对的虚拟 COM 端口,它们作为空调制解调器循环在一起。
但是,EnumPorts()
函数找不到 com0com 端口(即使没有过滤“COM”)。 super 终端和 SysInternals PortMon 都可以看到它们,所以我确定它安装正确。
那么还有其他一些 Win32 函数可以提供可用串行端口的明确列表吗?
最佳答案
EnumSerialPorts v1.20 Nick D 建议使用九种不同的方法来列出串行端口!我们当然不缺少选择,尽管结果似乎有所不同。
为了省去其他人的麻烦,我将在这里列出它们,并指出它们在我的 PC (XP Pro SP2) 上成功找到 com0com
端口:
CreateFile("COM"+ 1->255) 根据 Wael Dalloul 的建议
✔ 找到 com0com 端口,花费了 234 毫秒。QueryDosDevice()
✔ 找到 com0com 端口,花费了 0 毫秒。GetDefaultCommConfig("COM"+ 1->255)
✔ 找到 com0com 端口,花费了 235 毫秒。“SetupAPI1”使用对 SETUPAPI.DLL 的调用
✔ 找到 com0com 端口,还报告“友好名称”,花费了 15 毫秒。“SetupAPI2”使用对 SETUPAPI.DLL 的调用
✘ 未找到 com0com 端口,报告“友好名称”,耗时 32 毫秒。EnumPorts()
✘ 报告一些非COM端口,没有找到com0com端口,花了15ms。使用 WMI 调用
✔ 找到 com0com 端口,还报告“友好名称”,花费了 47 毫秒。使用 MSPORTS.DLL 调用的 COM 数据库
✔/✘ 报告了一些非 COM 端口,找到了 com0com 端口,花费了 16 毫秒。迭代注册表项 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
✔ 找到 com0com 端口,花费了 0 毫秒。这显然就是SysInternals PortMon用途。
根据这些结果,我认为 WMI 方法可能最适合我的要求,因为它相对较快,而且它还提供了友好的名称(例如“通信端口 (COM1)”、“com0com - 串行端口模拟器”) .
关于winapi - 如何获取 Win32 中可用串行端口的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1388871/