什么是在Python中枚举串口的跨平台方法(包括虚拟端口)?

时间:2012-07-03 02:51:18

标签: python cross-platform serial-port python-2.7 pyserial

注意:我正在使用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 个答案:

答案 0 :(得分: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*')

答案 1 :(得分:7)

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

Link to source file 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。

有趣的是看到documentation for this command中的平台部分:

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

我认为两者的合并应该给出(几乎)100%可靠的com端口枚举器。

编辑:在Python 2.7中尝试了以上所有内容。

答案 2 :(得分:3)

pyserial函数serial.tools.list_ports能给你你想要的吗?

答案 3 :(得分:0)

我不知道你是否还在寻找答案,但由于我有一个有效的解决方案,我以为我会发布它。这是the getports package作为我的Arduino Data Logger项目的一部分。我已经测试过它可以在Mac上运行,至少有一些Linux和Windows 7。与bitpim的comscan不同,它不使用任何来自标准库的模块。此外,它不在Linux或Mac上使用/dev globbing,因此重命名规则应该不是问题。 (在Linux上它使用sysfs,在Mac上使用IOKit。)我不知道它是否在Linux上检测到虚拟串口,但如果没有,请尝试替换

sys_suffix = '/device/'

sys_suffix = ''
linuxgetports.py

中的