使用Python列出可用的com端口

2024-05-23 13:31:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个简单的方法列出一台电脑上所有可用的com端口

我找到了这个方法,但它是Windows特有的:Listing serial (COM) ports on Windows?

我在Windows 7上使用Python 3和pySerial

我在pySerial API(http://pyserial.sourceforge.net/pyserial_api.html)中找到了一个列出com端口的函数serial.tools.list_ports.comports()(正是我想要的)。

import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

但似乎没用。当我的USB-to-COM网关连接到PC时(我在设备管理器中看到COM5),这个COM端口不包括在由list_ports.comports()返回的列表中。相反,我只得到似乎连接到调制解调器的COM4(我在设备管理器的COM&LPT部分看不到它)!

你知道为什么不起作用吗?你有没有另一个不特定于系统的解决方案?


Tags: 方法端口com管理器windowsserialportstools
3条回答

这是我使用的代码。

使用Python2和Python3在Windows 8.1 x64、Windows 10 x64、Mac OS X 10.9.X/10.10.X/10.11.X和Ubuntu14.04/14.10/15.04/15.10上成功测试。

import sys
import glob
import serial


def serial_ports():
    """ Lists serial port names

        :raises EnvironmentError:
            On unsupported or unknown platforms
        :returns:
            A list of the serial ports available on the system
    """
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result


if __name__ == '__main__':
    print(serial_ports())

您可以使用:

python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"

按已知端口筛选: python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

查看更多信息: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports

Thomas完美答案的一个可能改进是让Linux和OSX也尝试打开端口,并只返回那些可以打开的端口。这是因为Linux至少在/dev/中将大量端口列为文件,而这些文件与任何东西都没有连接。如果您在终端中运行,/dev/tty是您在其中工作的终端,打开和关闭它可能会使您的命令行出错,因此glob被设计为不这样做。代码:

    # ... Windows code unchanged ...

    elif sys.platform.startswith ('linux'):
        temp_list = glob.glob ('/dev/tty[A-Za-z]*')

    result = []
    for a_port in temp_list:

        try:
            s = serial.Serial(a_port)
            s.close()
            result.append(a_port)
        except serial.SerialException:
            pass

    return result

托马斯代码的修改只在Ubuntu 14.04上测试过。

相关问题 更多 >