Странные b '\ x' данные при последовательной связи между avr и python - PullRequest
2 голосов
/ 21 июня 2019

Я пытаюсь отправлять и получать данные между python и скриптом atmega128 avr.Я получаю странный тип байта, который я не понимаю.

Я пытался прочитать данные в коде Python, но результаты выглядят как b '\ x00' b '\ x06' b '\ x9e'b'f' b '\ x06'.Что не так в моем коде?

Вот мой основной поток atmega

unsigned char Message[]="Initialization Complete!"; 
unsigned char buff = 0;

MCU_init(); 
UART_init_with_INT();

uart_send_string(Message,25);
uart_send_byte('\n');
uart_send_byte('\r');

return 0;

Это мой скрипт чтения данных Python

import serial

ser = serial.Serial('COM4', 115200)

while(True):
    print(ser.read())

#ser.write(b'hello test')
ser.close()

Это мой настоящий странныйрезультат

b'\x86'
b'\x98'
b'\xf8'
b'\x9e'
b'\x86'
b'\x9e'
b'`'
b'f'
b'\x9e'
b'\x06'
b'\x06'
b'\x9e'
b'\x86'
b'\x9e'
b'\x98'
b'f'
b'\x06'
b'~'
b'\x86'
b'\x9e'
b'\xfe'
b'\x9e'
b'\xf8'
b'\x9e'
b'\x00'
b'\x98'
b'\x80'
b'\xe6'
b'\x9e'
b'\xe6'
b'\x9e'
b'\x00'
b'\x06'
b'\x9e'
b'f'
b'\x06'
b'~'
b'f'
b'f'
b'\x18'
b'\x06'
b'\xe6'
b'\x80'

Однако я ожидаю, что результат будет "Initialization Complete!"

PS Это реализация UART

void uart_send_byte(unsigned char byte)
{
        while(!(UCSR1A&(1<<UDRE1)));
        UDR1 = byte;
}

void uart_send_string(unsigned char *str, unsigned char len)
{
        int i;
        for(i=0;i<len;i++) {
                if(!(*(str+i)))
                        break;
                uart_send_byte(*(str+i));
        }
}

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Спасибо всем, я решил.

Я изменил свой код Python, как показано ниже, и готово! Мне пришлось настроить порт.

import serial

ser = serial.Serial(
    port='/COM4',
    baudrate=57600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS
)

while(True):
    print(ser.readline())

ser.close()
0 голосов
/ 21 июня 2019

Что Python читает, это байты: https://docs.python.org/3/library/stdtypes.html

Если вы хотите преобразовать байты в ascii, вы можете сделать это с помощью следующей функции:

ser.read().decode("ascii")

В зависимости от кодировки,аргумент может измениться (например, может быть utf-8)

...