31

注意:我使用 Python 2.7 和 pySerial 进行串行通信。

我发现这篇文章列出了两种方式:http ://www.zaber.com/wiki/Software/Python#Displaying_a_list_of_available_serial_ports

此方法适用于 Windows 和 Linux,但有时会错过 Linux 上的虚拟端口:

import serial

def scan():
   # scan for available ports. return a list of tuples (num, name)
   available = []
   for i in range(256):
       try:
           s = serial.Serial(i)
           available.append( (i, s.portstr))
           s.close()
       except serial.SerialException:
           pass
   return available

print "Found ports:"
for n,s in scan(): print "(%d) %s" % (n,s)

而这个仅适用于 Linux,但包括虚拟端口:

import serial, glob

def scan():
   # scan for available ports. return a list of device names.
   return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')

print "Found ports:"
for name in scan(): print name

我想我可以在 Linux 上运行时使用第二种方法(包括虚拟端口的方法)进行平台检测,在运行 Windows 时使用第一种方法,但是 Mac 呢?

无论平台如何,我应该如何枚举串行端口(也是虚拟的)?

编辑

我发现了一些相关的问题:

4

4 回答 4

8

这是我一直在使用的。这是我上面发布的方法的混搭。不过,我仍然希望看到更好的解决方案。

# A function that tries to list serial ports on most common platforms
def list_serial_ports():
    system_name = platform.system()
    if system_name == "Windows":
        # Scan for available ports.
        available = []
        for i in range(256):
            try:
                s = serial.Serial(i)
                available.append(i)
                s.close()
            except serial.SerialException:
                pass
        return available
    elif system_name == "Darwin":
        # Mac
        return glob.glob('/dev/tty*') + glob.glob('/dev/cu*')
    else:
        # Assume Linux or something else
        return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')
于 2012-07-09T15:39:24.463 回答
7

bitpim在多个平台上有相当多的 comscan 代码。从那里获取一些代码以构建跨平台串行端口枚举器可能很有用。您可以直接在命令行中运行检测代码进行测试。

链接到源文件 comscan.py

在 Linux 中,它似乎没有检测到“/dev/ttyS”端口。在 #378 行下方添加以下行:

("/dev/ttyS", "Standard Serial Port", "serial"),

作者使为串行端口添加不同类型的标识符变得容易。

在 Mac 中,它工作得很好。(有一个 Arduino 方便测试)

在 Windows 中,它成功检测到连接的端口(用于连接的 FTDI 连接器)。需要pywin32

使用pyserial,我尝试了以下操作:

python -m serial.tools.list_ports

似乎不适用于 Windows。在 Mac 上工作。在 Linux 上工作。

有趣的是查看此命令文档中的平台部分:

Platform :  Posix (/dev files)
Platform :  Linux (/dev files, sysfs and lsusb)
Platform :  Windows (setupapi, registry)

我认为将两者结合起来应该可以提供(几乎)100% 可靠的通信端口枚举器。

编辑:在 Python 2.7 中尝试了以上所有方法。

于 2012-09-21T10:23:15.360 回答
4

pyserial 函数serial.tools.list_ports是否给您想要的?

于 2012-07-03T20:16:43.823 回答
0

我不知道你是否还在寻找这个问题的答案,但由于我有一个可行的解决方案,我想我会发布它。这是我的 Arduino 数据记录器项目中的 getports 包。我已经测试过它可以在 Mac、至少某些版本的 Linux 和 Windows 7 上运行。与 bitpim 的 comscan 不同,它不使用任何非标准库中的模块。此外,它在 Linux 或 Mac 上不使用/dev通配符,因此重命名规则应该不是问题。(在 Linux 上它使用 sysfs,在 Mac 上它使用 IOKit。)我不知道它是否检测到 Linux 上的虚拟串行端口,但如果没有,请尝试替换

sys_suffix = '/device/'

sys_suffix = ''

linuxgetports.py

于 2013-02-19T19:53:57.387 回答