gpt4 book ai didi

python - pySerial list_port 准确性

转载 作者:行者123 更新时间:2023-11-28 17:43:07 29 4
gpt4 key购买 nike

我想使用 pySerial 的 serial.tools.list_ports.comports() 列出可用的 COM 端口。

阅读documentation :

The function returns an iterable that yields tuples of three strings:

  • port name as it can be passed to serial.Serial or serial.serial_for_url()
  • description in human readable form
  • sort of hardware ID. E.g. may contain VID:PID of USB-serial adapters.

我对第三个字符串特别感兴趣,用于搜索具有 VID:PID 对的特定 USB 串行适配器。我希望它(理想情况下)能够在 Windows XP 及更高版本、Mac OS X 和 Linux 中工作。我已经在 Ubuntu 13.10 和 Windows 7 中尝试过使用 pySerial 2.7,并且效果很好,但文档还说:

Also note that the reported strings are different across platforms and operating systems, even for the same device.

Note: Support is limited to a number of operating systems. On some systems description and hardware ID will not be available.

您在现实世界中是否有任何关于这些歧义的经验?更详细的信息?任何不工作的例子?跨系统的硬件 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(':' )(这很愚蠢,为什么要解析值来构建一个字符串,之后必须再次解析?!,我的意思是他们这样做 szHardwareID_str = 'USB VID:PID=%s:%s SNR= %s' % (m.group(1), m.group(2), m.group(4)) 只有一个元组我们再高兴不过了!)

最后,pyserial 看起来与其文档不一致,正如它所说:在某些系统上描述和硬件 ID 将不可用(无)。,而它确实返回 'n/a'。我想这将在 pyserial 2.8 中修复:-)

关于python - pySerial list_port 准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861300/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com