2017-07-14 89 views
2

我想通过串行在python中发送数组[0, 100, 150, 175, 255]。我将它转换为bytearray然后发送它。如何通过串口发送和接收十进制数组?

的数据我收到的样子

['\x00', 'd', '\x96', '\xaf', '\xff'],我不能回去[0, 100, 150, 175, 255]

有没有更好的方式来发送和接收这种数据?我是python的新手,对某些方法不熟悉。

这些是我正在使用的代码。

SEND

import serial 
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=10) 
elements= [0,100,150,175,255] 
data2=bytearray(elements) 

while True: 
     ser.write(data2) 

RECEIVE

import serial 
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=10) 
vect = [] 

while True: 
     vect.extend(ser.read()) 

谢谢。

回答

0

当然,你可以回去[0, 100, 150, 175, 255]!您发送的数据来自bytearray,您还应该使用bytearray来接收数据。要将收到的字节转换回整数,您只需要将bytearray传递给list()即可。

这里有一个演示:

elements = [0, 100, 150, 175, 255] 

# Buffer for sending data 
data2 = bytearray(elements) 

# Buffer for reading data 
rdata = bytearray() 

# Simulate sending data over the serial port 
rdata.extend(data2[0:2]) 
rdata.extend(data2[2:5]) 

vect = list(rdata) 
print(vect) 

输出

[0, 100, 150, 175, 255] 

此代码工作正常在两个Python 2和Python 3的

0

这是很有诱惑力的在这里使用eval()

while True: 
     vect = eval(ser.read().decode('unicode_escape')) 

然而,使用它。使用eval()通常不好。我认为@ PM2Ring的答案更好。

+0

真的吗? 'eval'和''unicode_escape'' ??? –

+0

@ PM2Ring这有什么问题? –

+1

只有当你没有别的选择时才应该使用'eval'。通常应避免“eval”变慢,“eval”和“exec”,因为它们可能存在安全风险。将任意unsanitised数据传递给'eval'是_extremely_不安全。有关详情,请参阅SO老将Ned Batchelder的[Eval really dangerous](http://edbatchelder.com/blog/201206/eval_really_is_dangerous.html)。 –

0

尝试收到字符转换为int:

vect.extend([ord(ch) for ch in ser.read()]) 
相关问题