2016-02-02 42 views
2

我在與蟒3.我通過串行連接控制一個Arduino和用下面的代碼讀取它進行解碼接收到的字節的一個問題:與解碼字節到字符串或ASCII在python問題3

import serial 
arduino = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=20) 
print(arduino.isOpen()) 
myData = arduino.readline() 
print(myData) 

我得到的結果看起來像b'\xe1\x02\xc1\x032\x82\x83\x10\x83\xb2\x80\xb0\x92\x0b\xa0'b'\xe1\x02"\xe1\x00\x83\x92\x810\x82\xb2\x82\x91\xb2\n',並嘗試通過myData.decode('utf-8')以通常方式解碼,並且我得到錯誤UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 1: invalid start byte。我嘗試了其他解碼(ASCII,cp437,hex,utf-16),但總是面臨同樣的錯誤。

你有什麼建議,我如何解碼接收到的字節或解碼arduino需要的?我已經嘗試使用for循環逐段解碼它,但我總是面臨同樣的錯誤信息。

有沒有一種通用的方法來避免解碼問題或找出哪些解碼我必須使用?

在此先感謝。

+1

arduino發送什麼樣的數據? –

+3

你需要知道什麼編碼是正確解碼它。查看發送數據的文檔,並希望他們能夠指定這些字節應該是什麼。然後,在'try'-'except'塊中解碼數據,並編寫一個錯誤處理函數來處理不可避免的異常......因爲不管規範說什麼,遲早都會得到垃圾輸入。 –

+2

你爲什麼認爲這應該是文本數據呢?至於編碼方面,請在閱讀其他代碼行前閱讀http://www.joelonsoftware.com/articles/Unicode.html,這是爲了人類的緣故。但編碼在這裏看起來不像你的問題 - 這可能是二進制數據。 – jsbueno

回答

1

由於@jsbueno在評論中說這不是一個解碼問題,這可能是因爲接收的字節數據實際上是二進制數據。從文件讀取二進制數據(字節)時,我遇到了非常類似的問題。

有2個選項在這裏使用,第一個是結構模塊:

import struct 
a = open("somedata.img", "rb") 
b = a.read(2) 
file_size, = struct.unpack("i",a.read(4)) 

寫這樣產生一個元組的代碼,因此要獲得一個整數,只要使用struct.unpack('i', a.read(4))[0]

另一個我使用的方式,如果你想存儲在一個numpy陣列的數據是:

import numpy as np 

f = open("somefile.img", "r") 
a = np.fromfile(f, dtype=np.uint32) 
+0

感謝您對二進制數據的解釋,但第一個代碼不適合我。當我把接收到的數據放到一個文件中時,'read()'函數告訴我,'bytes'沒有屬性讀取,並且它沒有做任何事情。你以前遇到過這個問題嗎?第二種方法似乎正確地轉換它。 – kire