注意:我正在使用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呢?
无论平台如何,我应该如何枚举串口(虚拟)?
修改
我发现了一些相关的问题:
答案 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
中的