如何处理 Raspberry pi 中的串行读取值
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 是用户按钮。我已经尝试使用 .putc('e') 但它也是一样的。
我该如何处理这个问题?
谢谢!!
您的代码中的问题是 Serial.readline()
return 一个 bytes
对象,而不是字符串。这就是为什么您在打印时会看到 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
我一直在尝试在树莓派和我的 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 是用户按钮。我已经尝试使用 .putc('e') 但它也是一样的。
我该如何处理这个问题?
谢谢!!
您的代码中的问题是 Serial.readline()
return 一个 bytes
对象,而不是字符串。这就是为什么您在打印时会看到 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