![](/img/trans.png)
[英]Arduino Serial.Read() unstable with Raspberry Pi Serial.write()
[英]How to process a serial read value in Raspberry pi
我一直在尝试在树莓派和我的 STM32 板之间进行一些串行通信(我使用 MBEDOS 作为固件)。
现在,我能够从我的树莓派到微控制器进行串行写入,并且成功了。
但是,我想尝试从微控制器向树莓派写一些东西,树莓派应该处理它。 但是,它似乎没有这样做。
树莓派的代码很简单:
import time
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
while 1:
x=ser.readline()
if x[2] == "e":
break
print x
print("stop")
对我的代码做一点解释,我想做的是当我的微控制器发送一个“e”时,它应该从循环中中断。 我使用 x[2] 因为我注意到当我们打印串行数据时,它会打印:
b'eeeeeee\n'
因此,我决定使用 x[2]。
在微控制器部分,我使用了:
if(butn == 1) {
// raspi.putc('e');
raspi.printf("eeeeeee");
swo.printf("e is printed");
}
其中 butn 是用户按钮。 我已经尝试过 using.putc('e') 但它也是一样的。
我该如何处理这个问题?
谢谢!!
您的代码中的问题是Serial.readline()
返回的是bytes
对象,而不是字符串。 这就是为什么在打印b
时看到b
的原因。
现在,使用字节对象建立索引不会计算其字符串表示形式中出现的b和'; 因此,如果要使用第一个字符,则应使用x[0]
。 但是,当在bytes对象中使用索引时,您将不会获得字符,但将获得所请求的特定字节的数字表示形式。
x = b'eeeee'
print x[0]
>>> 101
毫不奇怪,101是'e'的ascii。
您需要将x [0]强制转换为字符。 结果将是:
while 1:
x=ser.readline()
if chr(x[0]) == "e":
break
print x
另一种选择是编写以下内容:
x = hex(int.from_bytes((ser.readline()), 'big'))
if x[2] == 'e':
break
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.