在Windows上列出串口(COM端口)?

33 投票
8 回答
61656 浏览
提问于 2025-04-15 13:16

我想找一种可靠的方法来列出Windows电脑上可用的串口(COM端口)。有一篇关于使用WMI的帖子,但我希望能找到一种不那么依赖.NET的方式——我想在Python或C++程序中获取端口列表,而不使用.NET。

目前我知道另外两种方法:

  1. 读取注册表中的 HARDWARE\\DEVICEMAP\\SERIALCOMM 信息。这看起来是个不错的选择,但它真的可靠吗?我在网上或MSDN上找不到任何保证,说明这个注册表项总是包含所有可用端口的完整列表。

  2. 尝试调用 CreateFile,用 COMN 形式,其中N是从1开始的数字。这种方法不够好,因为并不是所有的COM端口都叫COMN。例如,一些创建的虚拟COM端口叫CSNA0、CSNB0等等,所以我不太相信这种方法。

还有其他方法、想法或经验可以分享吗?

编辑:顺便说一下,这里有一个简单的Python实现,用于从注册表读取端口名称:

import _winreg as winreg
import itertools


def enumerate_serial_ports():
    """ Uses the Win32 registry to return a iterator of serial 
        (COM) ports existing on this computer.


    """
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    try:
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
    except WindowsError:
        raise IterationError

    for i in itertools.count():
        try:
            val = winreg.EnumValue(key, i)
            yield (str(val[1]), str(val[0]))
        except EnvironmentError:
            break

8 个回答

6

PySerial项目提供了一些解决方案,具体可以查看这里

36

使用pySerial和Python:

import serial.tools.list_ports


ports = list(serial.tools.list_ports.comports())
for p in ports:
    print p
8

有几种方法可以选择:

  1. 可以调用 QueryDosDevice,把设备名称设为NULL,这样可以列出所有的DOS设备。然后用CreateFile和GetCommConfig,逐个检查这些设备名称,看看哪个是串口。

  2. 可以调用 SetupDiGetClassDevs,并使用GUID_DEVINTERFACE_COMPORT这个类的GUID。

  3. WMI也可以用于C/C++程序

win32新闻组和一个CodeProject项目上有一些讨论,具体可以查看这个链接

撰写回答