2014-02-18 56 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,但這正是我需要的。謝謝! –