简体   繁体   中英

How to process a serial read value in Raspberry pi

I have been trying to have some serial communication between raspberry and my STM32 board (I use MBEDOS for the firmware).

Right now, I am able to do serial writing from my raspberry to the microcontroller, and succeed.

However, I wanted to try to write something from the microcontroller to the raspberry, and the raspberry should process it. But, it seems that it fails to do so.

The code of the raspberry is quite simple:

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")

A little explanation to my code, what I wanted to do is when my microcontroller send an "e", it should break from the loop. I used x[2] because I noticed when we print the serial data, it will print:

b'eeeeeee\n'

hence,I decided to use x[2].

In the microcontroller part, I used:

if(butn == 1) {
        // raspi.putc('e');
        raspi.printf("eeeeeee");
        swo.printf("e is printed");
    }

where butn is the user button. I already tried using.putc('e') but it is the same as well.

How can I deal with this problem?

Thank you!!

The problem in your code is that Serial.readline() return a bytes object, not a string. That's why you see the b when it gets printed.

Now, indexing with bytes objects doesn't count the b and the ' that appear in its string representation; so if you want the first character, you should use x[0] . However, when you use indexing in the bytes object you won't get a character, you will get the number representation of the particular byte you requested.

x = b'eeeee'
print x[0]

>>> 101

Unsurpisingly, 101 is the ascii for 'e'.

You need to cast x[0] to a character. The result would be:

while 1:
     x=ser.readline()
     if chr(x[0]) == "e":
         break         
     print x

Another option is to write the following:

x = hex(int.from_bytes((ser.readline()), 'big'))
if x[2] == 'e':
    break

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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