2016-02-02 6 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), но всегда сталкивался с той же ошибкой.

Есть ли у вас какие-либо предложения, как я могу декодировать полученные байты или декодировать ардуино? Я уже пытался декодировать его по частям с помощью цикла for, но я всегда сталкиваюсь с тем же сообщением об ошибке.

И есть ли общий способ избежать проблем с декодированием или выяснить, какое декодирование я должен использовать?

Заранее спасибо.

+1

Каковы данные отправки arduino? –

+3

Вам нужно знать, что кодировка должна правильно декодировать. Посмотрите документацию о том, что отправляет данные, и надеемся, что они потрудились указать, какими должны быть эти байты. Затем декодируйте данные в блоке 'try'-' exccept' и напишите функцию обработки ошибок, чтобы справиться с неизбежными исключениями ... потому что рано или поздно вы получите мусорный ввод, независимо от того, что говорит спецификация. –

+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()' говорит мне, что «байты» не читают атрибут, и он ничего не делает. Вы сталкивались с этой проблемой раньше? Второй подход, похоже, преобразует его должным образом. – kire

 Смежные вопросы

  • Нет связанных вопросов^_^