2016-03-07 83 views
1

在我的Arduino上,我收到了Zigbee I/O數據包。每個數據包有26個字節。我試圖執行給定的程序,並得到一個錯誤。讀取到達串口的數據包

這是代碼:

import serial 
ser=serial.Serial('COM17',9600,timeout=1) 


while 1: 

Data_in=ser.readline().encode('hex') 
if Data_in[0:2]=='7e': 
    Data_in.split('7e',-1) 
    print("===================================") 
    print("Found Packet :") 
    print(Data_in) 
    if Data_in[6:8]=='92': 
     print("Packet type = Zigbee I/O Packet") 
     AD=Data_in[22:24] 
     print ("Device address") 
     print(AD) 
     SMH=Data_in[34:36] 
     SML=Data_in[36:38] 
     RH=Data_in[38:40] 
     RL=Data_in[40:42] 
     PH=Data_in[42:44] 
     PL=Data_in[44:46] 
     print("Soil moisture") 
     print(SMH) 
     print(SML) 
     print("Rain") 
     print(RH) 
     print(RL) 
     print("PIR") 
     print(PH) 
     print(PL) 
    print("====================================") 
print(" ") 

我得到的錯誤是:

Traceback (most recent call last): 
    File "C:\Windows\System32\chime2.py", line 5, in <module> 
    Data_in=ser.readline().encode('hex') 
AttributeError: 'bytes' object has no attribute 'encode' 

可能是什麼問題?

+0

看起來像從'readline'獲取一個字節對象。如果是這樣,你不需要編碼到十六進制。代碼看起來像是在某些時候從readline方法獲得了字符串。你是否從某處複製代碼? – Peter

+0

是的,我提到我在網上找到的代碼n根據我的要求改變它:( –

+0

所以它是否意味着如果我刪除該編碼('十六進制')部分我會得到在十六進制數據包? –

回答

0

錯誤是自我解釋性的:AttributeError:'字節'對象沒有屬性'編碼'

您正在使用Python 3.x解釋器,並且serial.readline()會爲您提供一個bytes對象。在Python 3中,字符串是16位的unicode字符串,並且bytes對象不支持encode方法。

正確的方法是使用codecs.encode,這將工作同樣在Python2和Python3:

import codecs 
... 
Data_in=codecs.encode(ser.readline(), 'hex') 

或者,你可以直接處理的字節數,但它需要在代碼的其餘更多的變化。