我想使用pySerial的serial.tools.list_ports.comports()
来列出可用的COM端口。
阅读documentation:
函数返回一个iterable,该iterable生成三个字符串的元组:
端口名,因为它可以传递给serial.serial或serial.serial_for_url()
人类可读形式的描述
硬件ID的种类。例如,可能包含USB串行适配器的VID:PID。
我特别感兴趣的是第三个字符串来搜索带有VID:PID对的特定USB串行适配器。我希望它(理想情况下)能在Windows XP和更高版本、Mac OS X和Linux中工作。我在Ubuntu 13.10和Windows 7中试过pySerial 2.7,工作起来很有魅力,但是文档中也说:
还要注意,报告的字符串在不同的平台上是不同的
和操作系统,即使是同一个设备。
注意:支持仅限于多个操作系统。在一些
系统描述和硬件ID将不可用。
对于这些模棱两可的地方,你有什么实际经验吗?更详细的信息?有没有不起作用的例子?系统间硬件ID字符串的变化?
谢谢!
最佳答案
我想如果你想要一个反例来说明它的工作方式与预期不符,我得到的是:
>>> serial.tools.list_ports.comports()
[('/dev/tty.Bluetooth-Incoming-Port', '/dev/tty.Bluetooth-Incoming-Port', '/dev/tty.Bluetooth-Incoming-Port'), ('/dev/tty.Bluetooth-Modem', '/dev/tty.Bluetooth-Modem', '/dev/tty.Bluetooth-Modem'), ('/dev/tty.usbserial-A1024XBO', '/dev/tty.usbserial-A1024XBO', '/dev/tty.usbserial-A1024XBO')]
插入FTDI USB串行适配器的位置。这是可以预期的,因为这里有
comports()
函数:def comports():
"""scan for available ports. return a list of device names."""
devices = glob.glob('/dev/tty.*')
return [(d, d, d) for d in devices]
对于cygwin、BSD、NetBSD、IRIX、HP-UX、Solaris/SunOS、AIX…
为什么会有这样的结果呢?嗯,因为我的pyserial是2.6版,才六个月大:-)
从pypi升级到最新版本(2.7)后,我得到了以下信息:
>>> serial.tools.list_ports.comports()
[['/dev/cu.Bluetooth-Incoming-Port', 'n/a', 'n/a'], ['/dev/cu.Bluetooth-Modem', 'n/a', 'n/a'], ['/dev/cu.usbserial-A1024XBO', 'FT232R USB UART', 'USB VID:PID=403:6001 SNR=A1024XBO']]
因此,基本上,在setup.py中为最新版本的
pyserial
添加一个版本检查,否则可能会出现问题。尽管对于其他unix风格,仍然没有添加支持。看起来VID:PID
字符串是通过解析操作系统特定的内容来直接处理的,以使该字符串足够通用。所以基本上我想你可以用类似这样的东西来安全地得到它:vid, pid = sp[2].split(' ')[1].split('=')[-1].split(':')
(这很愚蠢,为什么要解析值来构建一个字符串,然后必须再次解析它?!,我的意思是他们会的,只要一个元组我们就不会高兴了!)最后,pyserial看起来与其文档不一致,因为它说:
szHardwareID_str = 'USB VID:PID=%s:%s SNR=%s' % (m.group(1), m.group(2), m.group(4))
,而它确实返回了On some systems description and hardware ID will not be available (None).
。我想这将在pyserial 2.8中修复:-)