2017-04-11 54 views
0

我正在嘗試PySerial庫,我遇到了一個問題。 我正在使用一段代碼來設計選擇我的Arduino連接到的COM端口。該代碼是:調用函數方法拋出「AttritubeError'元組'對象沒有屬性」

import warnings 
import serial 
import serial.tools.list_ports 

arduino_ports = [ 
    p.device 
for p in serial.tools.list_ports.comports() 
if 'Arduino' in p.description 
] 
if not arduino_ports: 
raise IOError("No Arduino found") 
if len(arduino_ports) > 1: 
warnings.warn('Multiple Arduinos found - using the first') 

ser = serial.Serial(arduino_ports[0]) 

當我在Python運行的代碼(試圖3.6和2.7)我收到以下錯誤:

AttributeError       Traceback (most recent call last) 
<ipython-input-1-f19fcecc00c1> in <module>() 
6  p.device 
7  for p in serial.tools.list_ports.comports() 
----> 8  if 'Arduino' in p.description 
9 ] 
10 if not arduino_ports: 

AttributeError: 'tuple' object has no attribute 'description' 

我究竟在做什麼錯?

+0

檢查您的代碼縮進 - 這是錯誤的,但我懷疑是由於剪切和粘貼 – Mark

回答

1

您必須使用舊版本PySerial的 - 根據FineManual,似乎list_ports.comports()用於返回(port, description, hwid)元組的列表,而現在返回ListPortInfo對象的列表,而不是:

https://pythonhosted.org/pyserial/tools.html#serial.tools.list_ports.ListPortInfo

class serial.tools.list_ports.ListPortInfo
This object holds information about a serial port. It supports indexed access for backwards compatibility, as in port, desc, hwid = info.

所以你的選擇是要麼改變你的代碼與一個元組,而不是工作:

arduino_ports = [ 
    p[0] for p in serial.tools.list_ports.comports() 
    if 'Arduino' in p[1] 
] 

,或者更簡單地說,切換到更新版本的PySerial ...

+0

謝謝,你是對的錢 - 我使用PySerial版本2.7。僅用於文檔:我正在運行Anaconda,通過創建Python 3.5環境並通過通道'jneines'升級,我能夠升級到PySerial 3.2.1。 – AggroCrag

0
serial.tools.list_ports.comports() #will return a list containing ListPortInfo objects for < version 3.0, else return tuple. 

您正在使用列表中理解,所以更改

arduino_ports = [ 
    p.device 
for p in serial.tools.list_ports.comports() 
if 'Arduino' in p.description 
] 

此,

import serial.tools.list_ports 


ports = list(serial.tools.list_ports.comports()) 
arduino_ports = [] 
for port_no, description, address in ports: 
    if 'Arduino' in description: 
     arduino_ports.append(port_no) 
+1

這是什麼不同?這是相同的代碼,只是一行。 –

+0

@DanielRoseman:現在檢查,我忘了添加'list(serial.tools.list_ports.comports())' – Surajano

+0

這仍然在做基本相同的事情(對'list'額外的和無用的調用),並贏得顯然不能解決OP問題。 –

1

按我的知識,我建議你檢查的變量p的內容一致如果'Arduino'在p.description 你得到元組而不是對象我認爲

+0

的確很明顯。 –

+0

謝謝@bruno desthuilliers – Pankaj78691

相關問題