Чтение Serial дает ascii преобразование шестнадцатеричных - PullRequest
0 голосов
/ 13 апреля 2019

Я читаю последовательные данные, используя pyserial в Python 2.7. Данные выглядят следующим образом:

static uint8_t dataArray[] =
{

0x01, 0x31, 0x31, 0x31, 0xf1, 0xa9, 0xc3, 0x03,
0x1c, 0x02, 0xe1, 0xb2, 0x3f, 0x50, 0x7d, 0xfe,
0x7e, 0x3e, 0x8e, 0x1f, 0x91, 0x1d, 0x80, 0xd1,
0x67, 0x5b, 0x8f, 0x5f, 0x50, 0x53, 0xcd, 0xf1,
0x7b, 0xa8, 0x46, 0x73, 0x9e, 0x31, 0xf1, 0x93,
0x65, 0xee, 0xb8, 0x27, 0xc3, 0xec, 0x6d, 0x81,
0x2e, 0xa7, 0x8b, 0x15, 0x51, 0x61, 0xdc, 0x5f,
0xa1, 0x1a, 0xd9, 0xf6, 0x50, 0xac, 0x2b, 0x33,
0x3c,0x23
};

Теперь, когда я пытаюсь прочитать их в Python.он получен там как ascii преобразование каждого байта.Код Python выглядит следующим образом:

uart= serial.Serial()
uart.baudrate= 19200
uart.port = 'COM8'
uart.parity= serial.PARITY_NONE
uart.bytesize= serial.EIGHTBITS
uart.stopbits= serial.STOPBITS_ONE
uart.timeout = 40 
if(uart.is_open!=1):
    uart.open()

 while uart.is_open:


        byte = uart.read(1) #Read one byte in each iteration
        if(byte):
            #dencoded_byte = byte.decode('Ascii')
            dencoded_byte = byte.decode('utf-8')
            print dencoded_byte

Вывод, который я получаю до получения исключения

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 0: unexpected end of data

, выглядит следующим образом:

utf-8
1
1
1

Я пытался использовать byte.decode('Ascii') он также получает исключение, когда входящие данные больше 128 (он также не переводит эти данные, как они были отправлены, только дает снова ascii), также пытался конвертировать в int и т. д., но безуспешно.

Может кто-нибудьпредложить какое-то простое решение, которое может позволить мне прочитать любой байт, идущий от uart, до его максимума, который равен 256 = 2 ^ 8, а также я должен быть в состоянии записать его в виде чисел или по мере его отправки из последовательного порта?Например, первое шестнадцатеричное число, отправленное из серийного номера, 0x01 в массиве - я хочу напечатать то же самое в программе Python.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Если вы хотите число, соответствующее каждой 1-байтовой строке, используйте ord:

    if(byte):
        byte_num = ord(byte)
        print byte_num

Если бы вы использовали Python 3, было бы альтернативное решение, так как bytes экземпляры могутбыть индексирован для получения числовых значений, поэтому byte[0] будет таким же, как вызов ord(byte).

. Конечно, в Python 2 полученный вами байт уже является экземпляром str, так как нет никакого отличительногомежду байтами и 8-битными строками в этой версии Python (ваши decode вызовы, когда они работают, возвращают unicode экземпляров).Поэтому, возможно, решение состоит не в том, чтобы вообще пытаться декодировать байт, а просто в распечатанном виде: print byte.Я не уверен, что это будет разумно, поскольку печать некоторых управляющих символов может испортить вашу консоль.Но, возможно, это более разумный вариант, если вы собираетесь делать что-то кроме печати ваших данных, например, хранить их в какой-то структуре данных.

0 голосов
/ 13 апреля 2019

Спасибо всем за ваши ответы.

Наконец, удалось решить проблему. Просто с помощью следующего:

#these **first three lines are for only python2** 
#as Python 3 is default utf-8  
import sys

reload(sys) 
sys.setdefaultencoding('utf-8')

dencoded_byte = byte.encode('hex')

вместо:

dencoded_byte = byte.decode('utf-8')
...