首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Python列出可用的com端口

使用Python列出可用的com端口
EN

Stack Overflow用户
提问于 2012-08-23 19:25:31
回答 11查看 226.4K关注 0票数 103

我正在寻找一种简单的方法来列出PC上所有可用的com端口。

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

我在Windows7 PC上使用Python3和pySerial。

我在pySerial应用程序接口(http://pyserial.sourceforge.net/pyserial_api.html)中发现了一个函数serial.tools.list_ports.comports(),它列出了com端口(这正是我想要的)。

代码语言:javascript
复制
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

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

你知道为什么它不工作吗?您是否有其他非系统特定的解决方案?

EN

回答 11

Stack Overflow用户

发布于 2013-01-09 05:38:10

这是我使用的代码。

在Windows8.1 x64,Windows10 x64,MacOSX10.9.x/ 10.10.x / 10.11.x和Ubuntu14.04/ 14.10 / 15.04 / 15.10上成功测试了Python2和Python3。

代码语言:javascript
复制
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())
票数 165
EN

Stack Overflow用户

发布于 2015-11-12 11:44:17

您可以使用:

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

票数 29
EN

Stack Overflow用户

发布于 2014-07-13 14:21:25

对Thomas的优秀答案的一个可能的改进是让Linux和可能的OSX也尝试开放端口,并只返回那些可以打开的端口。这是因为Linux至少在/dev/中以文件的形式列出了大量端口,这些端口没有连接到任何东西。如果您在终端中运行,则/dev/tty是您正在工作的终端,打开和关闭它可能会使您的命令行变得混乱,因此glob被设计为不会这样做。代码:

代码语言:javascript
复制
    # ... 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

对Thomas代码的这一修改仅在Ubuntu 14.04上进行了测试。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12090503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档