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

Gra*_*amS 49 winapi serial-port

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

出于测试目的,如果我可以将此代码用于com0com这样的代码,它将非常有用,它提供了作为零调制解调器循环在一起的虚拟COM端口对.

但是该EnumPorts()函数找不到com0com端口(即使没有过滤"COM").HyperTerminal和SysInternals PortMon都可以看到它们,所以我确信它安装正确.

那么还有其他一些Win32功能可以提供可用串口的明确列表吗?

Gra*_*amS 76

Nick D建议的EnumSerialPorts v1.20使用九种不同的方法列出串口!虽然结果似乎有所不同,但我们肯定不会做出选择.

为了省去其他人的麻烦,我会在这里列出并表明他们com0com在我的PC(XP专业版SP2)上找到端口的成功:

  1. 按照Wael Dalloul的建议创建文件("COM"+ 1-> 255)
    ✔找到com0com端口,耗时234ms.

  2. QueryDosDevice()
    ✔找到com0com端口,耗时0ms.

  3. GetDefaultCommConfig("COM"+ 1-> 255)
    ✔找到com0com端口,耗时235ms.

  4. 使用SETUPAPI.DLL调用"SetupAPI1"
    ✔发现com0com端口,也报告了"友好名称",耗时15ms.

  5. "SetupAPI2"使用SETUPAPI.DLL调用
    ✘没有找到com0com端口,报告"友好名称",耗时32ms.

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

  7. 使用WMI调用
    ✔发现com0com端口,也报告"友好名称",花了47ms.

  8. COM数据库使用调用MSPORTS.DLL✔
    /✘报告了一些非COM端口,发现com0com端口,耗时16ms.

  9. 迭代注册表项HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP \SERIALCOMM✔
    找到com0com端口,耗时0ms.这显然是SysInternals PortMon使用的.

基于这些结果,我认为WMI方法可能最适合我的要求,因为它相对较快,作为奖励,它还提供了友好的名称(例如"通信端口(COM1)","com0com - 串行端口仿真器").

  • @GrahamS - 我们最后使用了 C# .NET SerialPort.GetPortNames,它给出了普通的端口名称 COM1、COM2 等。不知道 .NET 在幕后使用哪种方法,但它执行得很快。我无法评论其他友好名称获取方法如何在蓝牙端口上执行。 (2认同)

Nic*_*kis 11

看起来这不是一项简单的任务.

看看这个:EnumSerialPorts v1.20

  • 请注意:"如果您想在应用程序中分发源代码,那么您只能分发作者发布的版本." 这使得它对任何开源都没用 - 除非原作者为你做了,否则你甚至无法修复bug.我建议任何人都在寻找串行代码,以便在不那么封闭的许可下找到一些东西. (2认同)

Wae*_*oul 5

你可以循环播放例如1到50并尝试打开每个端口.如果端口可用,则打开将起作用.如果端口正在使用中,您将收到共享错误.如果未安装端口,则会收到文件未找到错误.

打开端口使用CreateFile API:

HANDLE Port = CreateFile(
                  "\\\\.\\COM1",
                  GENERIC_READ | GENERIC_WRITE,
                  0,
                  NULL,
                  OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL,
                  NULL);
Run Code Online (Sandbox Code Playgroud)

然后检查结果.

  • 应该提到的是,如果您尝试使用CreateFile访问COM端口> 9,即使端口存在,您也将始终获得ERROR_FILE_NOT_FOUND.为避免这种行为,端口名称应作为\\.\ COMx传递(将x替换为我们要测试的端口号).链接:http://support.microsoft.com/kb/115831 (8认同)