Arduino SoftwareSerial

-1

He utilizado los pines 2 y 3 como entrada de serie de un módulo GPS. Tengo todo configurado correctamente, sin embargo, quiero realizar más tareas que solo leer un módulo GPS.

  void setup() {
    Serial.begin(9600);
    ///////////////////////////////////
    // 9600 NMEA is the default baud rate
    mySerial.begin(9600);
    Serial.println("NMEA Sentences");
    // uncomment this line to turn on only the "minimum recommended" data for high update rates!
    mySerial.println(PMTK_SET_NMEA_OUTPUT_RMCONLY);

    // uncomment this line to turn on all the available data - for 9600 baud you'll want 1 Hz rate
  //    mySerial.println(PMTK_SET_NMEA_OUTPUT_ALLDATA);

    // Set the update rate
    // 1 Hz update rate
    mySerial.println(PMTK_SET_NMEA_UPDATE_1HZ);
    // 5 Hz update rate- for 9600 baud you'll have to set the output to RMC only (see above)
    //   mySerial.println(PMTK_SET_NMEA_UPDATE_5HZ);
    // 10 Hz update rate - for 9600 baud you'll have to set the output to RMC only (see above)
    //  mySerial.println(PMTK_SET_NMEA_UPDATE_10HZ);
    //////////////////////////////////

  }

Suponiendo que tengo todas las configuraciones, etc. correctas en mi código, lo cual hago, si tengo esto

void loop() {
  if(mySerial.available()) {
     Serial.print((char)mySerial.read());
  }
}

y la oración NMEA se muestra bien. Sin embargo, quiero realizar más tareas, por lo que debo realizar algo como esto

void loop() {
  // perform lots of other functions here
  while(!otherFunctionsComplete) ... // Very time consuming code
  // just want to read 1 full nmea sentence from gps
  getGPSData();

}
void getGPSData() {
  // wait here until i get the GPRMCA sentence

  while (mySerial.available()) {
      Serial.print((char)mySerial.read());
    }
}

El problema es que solo obtengo el tamaño del búfer de 64 bytes de datos utilizando el segundo método. Quiero esperar y leer los bytes entrantes en la serie hasta que obtenga un '$ GPRMCA' y luego guarde el resto de los bytes. ¿Alguna ayuda con esto?

    
pregunta dran

1 respuesta

1

¿Qué hay de la forma habitual?

Defina un búfer (conviértalo en una matriz suficientemente grande de caracteres), luego lea todos los bytes en ese búfer (esta es la llamada mySerial.read () pero no lo imprime, lo escribe en un búfer), si Llegan bytes adicionales, copie los nuevos bytes al final del búfer y así sucesivamente. Después de cada iteración, compruebe si su condición coincide y realice las tareas requeridas (también puede descartar los bytes si no los necesita). Un ringbuffer es un enfoque muy bueno para un problema como este (pero no es necesario en este caso fácil).

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas