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

Chr*_*nte 31 python cross-platform serial-port pyserial python-2.7

注意:我使用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)
Run Code Online (Sandbox Code Playgroud)

这个只适用于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
Run Code Online (Sandbox Code Playgroud)

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

无论平台如何,我应该如何枚举串口(虚拟)?

编辑

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

Chr*_*nte 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*')
Run Code Online (Sandbox Code Playgroud)


Nan*_*ali 7

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

链接到源文件comscan.py.

在Linux中,它似乎没有检测到'/ dev/ttyS'端口.在#378行下面添加以下行:

("/dev/ttyS", "Standard Serial Port", "serial"),
Run Code Online (Sandbox Code Playgroud)

作者已经很容易为串行端口添加不同类型的标识符.

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

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

使用pyserial,我尝试了以下方法:

python -m serial.tools.list_ports

似乎不适用于Windows.适用于Mac.适用于Linux.

有趣的是看到此命令文档中的Platform部分:

Platform :  Posix (/dev files)
Platform :  Linux (/dev files, sysfs and lsusb)
Platform :  Windows (setupapi, registry)
Run Code Online (Sandbox Code Playgroud)

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

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


Ger*_*rat 4

pyserial 函数serial.tools.list_ports是否能够满足您的需求?