在一次arduino和树莓派通信实验中,发现一个问题,就是Python3 和Python2的版本,对于编码有不同的方法,不注意的话会使通信来说就形成错误,或者运行出错,笔者试了一下,发现3 的版本代码,python2也能实现,反过来就不行,下面通过实验来说明
arduino代码
int val;//定义变量val int ledpin = 13; //定义数字接口13 void setup() { Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。 pinMode(ledpin, OUTPUT); //设置数字13 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义。 } void loop() { val = Serial.read(); //读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val if (val == 'R') //判断接收到的指令或字符是否是“R”。 { //如果接收到的是“R”字符 Serial.println("Hello World!");//显示“Hello World!”字符串 digitalWrite(ledpin, HIGH); //点亮数字13 口LED。 delay(500); digitalWrite(ledpin, LOW); //熄灭数字13 口LED delay(500); } }
Python2的正常运行代码
#-*-coding:UTF-8-*- import serial ser = serial.Serial('/dev/ttyACM0',9600,timeout=1); try: while 1: ser.write('R'); response = ser.readall(); print response; except: ser.close();
返回的是
Hello World! Hello World!
Python3的正常运行代码
#-*-coding:UTF-8-*-
import serial
ser = serial.Serial('/dev/ttyACM0',9600,timeout=1);
try:
while 1:
ser.write('R'.encode());
response = ser.readall();
print (response);
except:
ser.close();
程序返回的是这个
b'Hello World!\r\n' b'Hello World!\r\n'
ser.write('R'.encode());
print (response);
Python3转换编码代码
#-*-coding:UTF-8-*- import serial ser = serial.Serial('/dev/ttyACM0',9600,timeout=1); try: while 1: ser.write('R'.encode()); response =ser.readall().decode(); print (response); except: ser.close();
最后实现效果跟2 的一样。,并且python2也能运行
Hello World! Hello World!
总结
这其实就是很简单的编码问题,
Python 2 将字符串处理为 bytes 类型。
Python 3 将字符串处理为 unicode 类型。
之前学的隔了好久什么都忘了,这样的编码问题应该学过,看来还是要多写写加深记忆和方便回忆。
问题参考
编码前缀
https://blog.csdn.net/anlian523/article/details/80504699
编码切换