如何处理 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