2017-07-14 120 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()]) 
相關問題