avr和python之间串行通信时出现奇怪的b'\ x'数据

Posted

技术标签:

【中文标题】avr和python之间串行通信时出现奇怪的b\'\\ x\'数据【英文标题】:Weird b'\x' data while communication between avr and python seriallyavr和python之间串行通信时出现奇怪的b'\ x'数据 【发布时间】:2019-11-04 09:01:17 【问题描述】:

我正在尝试在 python 和 atmega128 avr c 脚本之间发送和接收数据。我得到了我不理解的奇怪类型的字节。

我尝试在 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!"

附:这是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));
        

【问题讨论】:

注意:您发送\n\r 而不是\r\n。这是故意的吗? @Adam.Er8 没有错误。我刚刚切换到\r\n,但结果仍然很奇怪。有什么想法吗? 为什么这很奇怪?你期待什么不同? @MadPhysicist 我期待输出“初始化完成!” 可能你的端口设置不正确。 【参考方案1】:

python 正在读取的是字节:https://docs.python.org/3/library/stdtypes.html

如果您想将字节转换为ASCII,您可以使用以下函数:

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

根据编码,参数可能会改变(例如可能是 utf-8)

【讨论】:

这给了我错误 UnicodeDecodeError: 'ascii' codec can't decode byte 0x86 in position 0: ordinal not in range(128) @MadPhysicist:在 Python 3.x 中,如果你尝试 print() 一个 bytes 对象,你会得到它的 repr ,这将是一个 b 前缀的字节串文字(使用\x 转义)。这看起来正是 OP 所得到的。 @丹尼尔。这并不完全正确。 ASCII 可打印的每个字符都将显示为字符而不是十六进制代码。您可以在原始输出中使用`f~ 看到这一点。字节没有被打印为字符的事实几乎意味着它们不是 ASCII【参考方案2】:

谢谢大家,我解决了。

我如下更改了我的 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()

【讨论】:

以上是关于avr和python之间串行通信时出现奇怪的b'\ x'数据的主要内容,如果未能解决你的问题,请参考以下文章

Arduino/AVR:中断串行/I2C 通信是不是安全

iOS 5:在 TextField 之间跳转时出现奇怪的行为

python和arduino之间的串行通信

Arduino和Python之间的串行通信发送/接收数据

AVR USART 通信问题

使用串行通信在 python 和 arduino 之间进行同步