2016-03-07 86 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') 

或者,你可以直接处理的字节数,但它需要在代码的其余更多的变化。