2014-02-18 58 views
3

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

documentation

该函数返回产生三个字符串的元组可迭代:因为它可以被传递给serial.Serial或serial.serial_for_url(

  • 端口名称)
  • 人类可读形式的描述
  • 种类的硬件ID。例如。可能包含VID:USB串行适配器的PID。

我格外感兴趣第三字符串中搜索与VID特定的USB串口适配器:PID对。我希望它(理想情况下)能够在Windows XP及更高版本,Mac OS X和Linux上运行。我已经在Ubuntu 13.10和Windows 7 pySerial 2.7尝试和作品就像一个魅力,但该文档也说:

还要注意的是,报告的字符串是跨平台 和操作系统的不同,即使是相同的设备。

注意:支持仅限于许多操作系统。在某些 系统描述和硬件ID将不可用。

您是否有任何关于这些歧义的实际经验?更详细的信息?任何非工作的例子?系统间硬件ID字符串的变化?

非常感谢!

+0

ID的变化,这里有一个,你可以做'serial.Serial(0)'用于0',除了它具有在Windows不同的含义任意整数'和Linux操作系统。请记住,Windows编号从COM1和Linux开始,从ttyS0开始,然后添加到Windows COM过去9是'\\。\ COM10',而Linux udev允许您创建任意符号链接。最后,你最终会传递确切的字符串到'serial.Serail()' –

+0

@qarma'serial.Serial(0)'会给你在Windows 7上的COM1句柄。一般来说,你可以通过'int(COM_NUMBER - 1 )'以获得正确的端口,也适用于索引> 9。 – Fookatchu

回答

2

我想,如果你想它的工作的一个反例未如预期,这就是我得到:

>>> 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字符串直接通过解析OS特定的东西来处理,使该字符串足够通用。所以基本上我猜你可以安全地得到它: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看起来与它的文档不一致,因为它说:On some systems description and hardware ID will not be available (None).,而它确实返回'n/a'。我想这将是固定在pyserial 2.8 :-)跨系统

+0

你使用哪种unix风味和版本? –

+0

好吧,我在我的路由器上使用了linux,OSX和OpenBSD。不久前我还有几个FreeBSD。如果我想在我的烤面包机上安装unix,我会选择netbsd :-)虽然我的观点是可移植性不仅限于Win/Mac/Linux。 – zmo

+0

我的意思是第一次测试,没有返回VID:PID对,那是哪个操作系统?我知道可移植性不仅仅是Win/Mac/Linux,但这正是我需要的。谢谢! –