formato de flujo de datos arduino

2

Me pregunto cuál es el formato del flujo de datos en serie que normalmente se envía desde la computadora a arduino a través de la conexión en serie. mi proyecto usa una conexión en serie con arduino para enviar datos desde python (pyserial) a arduino, y cuando envío una cadena y trato de imprimirla en la pantalla LCD, aparece el primer carácter que cambia a chino o japonés.

así puede cualquier cuerpo explantar el formato de Steam para entender qué es lo que está mal o qué sucede.

este es el código arduino y el código python que utilicé: arduino:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
    lcd.begin(16, 2);
    lcd.print("hello, world!");
    Serial.begin(9600);
}

void loop() {
    lcd.setCursor(5, 1);
    char rd[5] ;
    Serial.readBytesUntil('.', rd, 5);
    Serial.flush();
    Serial.println();
    lcd.print(rd);
}

python

import serial
s = serial.Serial('/dev/ttyACM0',buadrate = 9600)
s.write('est.')

actualización Encontré a través del monitor en serie que el texto se recibe correctamente, pero el siguiente bucle da © como valor de rd.

    
pregunta yahya tawil

3 respuestas

2

Las cadenas deben terminarse en un carácter '\ 0' (normalmente 0x00) para indicar dónde está el final de la cadena.

por ejemplo, si inicializas una cadena como esta:

char message[] = "hello";

Almacena 'h' 'e' 'l' 'l' 'o' '\ 0' en la memoria.

Luego, en una rutina como 'imprimir', el código recorre la cadena imprimiendo cada carácter hasta que alcanza un carácter '\ 0'. Si ese personaje no está presente, seguirá adelante.

Creo que lo que está sucediendo en su código es que la matriz de bytes 'rd' no tiene un carácter de terminación '\ 0'. Para permitir cadenas de diferente longitud, intente lo siguiente:

void loop() {
    lcd.setCursor(5, 1);
    //6 bytes long to include '
char message[] = "hello";
' char rd[6]; //Read up to 5 bytes byte bytesReceived = Serial.readBytesUntil('.', rd, 5); //Set the next byte to '
void loop() {
    lcd.setCursor(5, 1);
    //6 bytes long to include '%pre%'
    char rd[6];
    //Read up to 5 bytes
    byte bytesReceived = Serial.readBytesUntil('.', rd, 5);
    //Set the next byte to '%pre%' to terminate the string
    rd[bytesReceived] = '%pre%';
    Serial.flush();
    Serial.println();
    lcd.print(rd);
}
' to terminate the string rd[bytesReceived] = '%pre%'; Serial.flush(); Serial.println(); lcd.print(rd); }
    
respondido por el geometrikal
3

Esta es la función de Python que utilizo para configurar los puertos serie de Arduino. Pruébalo:

def configure_port(port_id):
    ser = serial.Serial()
    ser.port = port_id
    ser.baudrate = 9600
    ser.rtscts = True
    ser.dsrdtr = True
    return ser

Uso:

port = configure_port("/dev/ttyACM0")
port.open()

Creo que establecer rtscts y dsrdtr en true es lo que funcionó para mí. El código anterior al menos funciona para Pro Micros; no especificaste qué Arduino estás usando, así que esta es mi mejor suposición.

    
respondido por el Chris Laplante
0

gracias a geometrikal, el problema fue: arduino recive una cadena sin terminar con \ 0, y cuando llega el siguiente bucle, va a la posición (5,1) , que es el primer carácter de la cadena impresa en la pantalla y arduino imprime sobre ella el valor predeterminado de la variable rd si no se recibe nada.

    
respondido por el yahya tawil

Lea otras preguntas en las etiquetas