繁体   English   中英

如何在树莓派中处理串行读取值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM