¿Cómo recibo una cadena completa en lugar de 1 carácter a la vez en el arduino?

10

Seguí correctamente las instrucciones de este sitio web:

enlace

y pude obtener comunicación entre el pi y mi arudino mega exactamente como lo especifica el sitio web.

Sin embargo, en lugar de enviar un número entero que represente la cantidad de veces que el LED parpadea, quiero enviar un texto ASCII como:

"MOVER 5 METROS HACIA ADELANTE", "GIRAR A LA IZQUIERDA", "MOVER 10 METROS HACIA ATRÁS" hacia el arduino desde el pi.

Escribí el siguiente código:

char inData[64];
char inChar=-1;

void setup(){
   Serial.begin(9600);
   Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}


void loop(){
    byte numBytesAvailable= Serial.available();

    // if there is something to read
    if (numBytesAvailable > 0){
        // store everything into "inData"
        int i;
        for (i=0;i<numBytesAvailable;i++){
            inChar= Serial.read();
            inData[i] = inChar;
        }

        inData[i] = '
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
'; Serial.print("Arduino Received: "); Serial.println(inData); } }

He flasheado el código anterior con éxito a mi Arduino Mega 2560.

Cambié a mi terminal python en la Raspberry Pi y en la consola escribí:

Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E

Lo que se muestra en el Monitor Serial de mi Arduino es el siguiente:

Arduino Received: MOVE

Pero lo que quiero es:

char inData[64];
char inChar=-1;

void setup(){
   Serial.begin(9600);
   Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}


void loop(){
    byte numBytesAvailable= Serial.available();

    // if there is something to read
    if (numBytesAvailable > 0){
        // store everything into "inData"
        int i;
        for (i=0;i<numBytesAvailable;i++){
            inChar= Serial.read();
            inData[i] = inChar;
        }

        inData[i] = '
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
'; Serial.print("Arduino Received: "); Serial.println(inData); } }

¿Cómo cambio el código anterior para que todos los caracteres entren en el búfer de inData?

    
pregunta user1068636

5 respuestas

20

El problema es que el Arduino está girando tan rápido que ejecutará la línea "if (numBytesAvailable > 0)" varias veces entre cada carácter que llega a través del puerto serie. Entonces, tan pronto como llega un personaje, lo toma, pasa de cero a uno e imprime un solo carácter.

Lo que debes hacer es enviar un carácter de final de línea ('\ n') después de cada comando desde tu programa Python. Luego, haz que el código de Arduino almacene cada carácter que recibe y solo actúe sobre el mensaje una vez que reciba el carácter de final de línea.

Entonces, si cambias tu código de Python, envía un carácter de final de línea, así:

import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE\n")

Entonces tu código de Arduino puede ser algo como esto:

// Buffer to store incoming commands from serial port
String inData;

void setup() {
    Serial.begin(9600);
    Serial.println("Waiting for Raspberry Pi to send a signal...\n");
}

void loop() {
    while (Serial.available() > 0)
    {
        char recieved = Serial.read();
        inData += recieved; 

        // Process message when new line character is recieved
        if (recieved == '\n')
        {
            Serial.print("Arduino Received: ");
            Serial.print(inData);

            inData = ""; // Clear recieved buffer
        }
    }
}
    
respondido por el Phil
5

Tu secuencia de comandos de Python está enviando cuatro bytes, M , O , V y E . ¿Cómo se supone que el Arduino sepa que esa es una sola cuerda? Considera que el código de Python:

ser.write("MOVE")

es completamente idéntico a

ser.write("MO")
ser.write("VE")

desde el punto de vista de Arduino. Los puertos serie transfieren caracteres, no cadenas.

En su código, el Arduino es rápido (en comparación con la velocidad de 9600 baudios), por lo que cada vez que llama a Serial.available() , solo ve uno de esos cuatro caracteres. Es por eso que obtuviste la salida que obtuviste.

Lo que deberás hacer es encontrar alguna forma de delimitar cadenas, es decir, marcarlas de alguna manera con Python para que Arduino pueda agregar los caracteres individuales que recibe en tu alta -nivel de concepto de una cadena .

Usar líneas es sencillo: envía cada cadena terminada con un carácter de nueva línea ( '\n' ). En el Arduino, lee los caracteres y agrégalos a tu cadena. Cuando ve un '\n' , la cadena ha terminado y puede imprimirla.

    
respondido por el Jim Paris
2
  if(Serial.available() > 0) {
     str = Serial.readStringUntil('\n');
     Serial.println(str);

El código anterior funciona perfectamente en mi conexión entre Pi y Arduino

    
respondido por el Douglas
1

Use .readline en lugar de .read

Tuve el mismo problema y esto lo solucionó de inmediato. Espero que esto haya ayudado!

    
respondido por el sam_trudgian
0

así es como lo hice desde el primer ejemplo

 'String readString;

void setup() {
 Serial.begin(9600); // initialization

}

  void loop() {
  char incomingByte;
  while (Serial.available()>0) {
  delay(10);  // if the data came

   incomingByte = Serial.read(); // read byte
 //Serial.println(incomingByte);

   readString +=incomingByte;

  }
  if(readString != "")
   {
     Serial.print("arduino recived this : ");
     Serial.println(readString);

   }
   readString = "";

  }'
    
respondido por el karim

Lea otras preguntas en las etiquetas

Comentarios Recientes

/ etc / Alternatives / rfduino luego pregunta:? // data / src / .draw; latitudiuh (datos); <| endoftext |> 'Stand By Your Girlfriend': la gente quiere besar a Shyla Black Out, ver a los oficiales de policía negros cometer feminicidio por características del niño yo o me he inmovilizado si las personas en ellos me lo piden. Recibí una solicitud de uno de mis lectores, Danny, que no había visto todos los detalles de un estudio en marzo, cuando se descubrió que el 65% de las mujeres pasarían el día, los fines de... Lees verder