Strtok() - Problem

Hallo zusammen,
Die Signale meines GPS-Empfängers sollen ausgelesen und zerlegt werden. Eigentlich sollte strtok() das Mittel der Wahl sein. Unter den verschiedenen Sätzen, die das GPS.Gerät sendet, wähle ich den RMC-Satz aus. Soweit, sogut. Das Zerlegen dieses Satzes in seine einzelnen Tokens klappt aber nicht so wie gewünscht.
Folgende Zeilen sollten ein Anfang sein:


// nach Matthias Busse 
// http://shelvin.de/den-nmea-0183-datensatz-gga-zerlegen-in-die-einzelnen-daten/

int inByte, start=0;
String nmea; 
const char comma = ",";
char token;

void setup() {
  Serial.begin(4800); // 4800 Baud Dateneingang und Konsole
  Serial.println("***");
}

void loop() {
  if (Serial.available()) { // sind Daten im Eingangspuffer
    inByte = Serial.read(); // dann lesen
    if ((start==0) && ((inByte == '$')||(inByte == '!'))) {
      start=1; nmea=""; // bei $ oder ! starten
    }
    if(start==1) {nmea.concat((char)inByte);} // das Zeichen anhängen
    if((inByte==13) && (start==1)) { // CR > Datensatzende > NMEA ausgeben
      start=0;
      if (nmea.substring(3,6) == "RMC") {
        Serial.println(nmea); // auf Konsole ausgeben
        Serial.println();
        int nmea_len = nmea.length() + 1;
        Serial.print("LEN: ");Serial.println(nmea_len);
        char char_array[nmea_len];
        nmea.toCharArray(char_array, nmea_len);
        Serial.print("CHAR: ");Serial.println(char_array);
        token = strtok(char_array, comma);
        while (token != NULL) {         
        Serial.print("TOKEN: ");Serial.println(token);
        token = strtok(NULL, comma);
        }
       }
      }
    }
  }

Ich erhalte folgendes, sobald das GPS-Gerät "warmgelaufen" ist:

$GPRMC,144252.00,A,5123.30614,N,00752.98778,E,0.733,,100723,,,A*78


LEN: 68
CHAR: $GPRMC,144252.00,A,5123.30614,N,00752.98778,E,0.733,,100723,,,A*78

TOKEN: ⸮

Was bedeutet das spiegelverkehrte Fragezeichen? Wo ist mein Denkfehler? Umwandlung String zu Char?

Grüße und danke,

-richard

const char *

warum willst du nicht auf eine Library zurückgreifen? TinyGPS++ fällt mir da z.B. ein?

Da sind noch viel mehr Fehler drin.
Viel mehr.....



const char comma[] = ",";

void setup()
{
  Serial.begin(9600);
  Serial.println("***");
}

void loop()
{

  char char_array[] = "$GPRMC, 144252.00, A, 5123.30614, N, 00752.98778, E, 0.733, , 100723, , , A * 78";

  char *token = strtok(char_array, comma);
  if(token) 
    do { Serial.print("TOKEN: "); Serial.println(token); }
    while((token = strtok(nullptr, comma)));
  
  Serial.println();
  delay(5000);
}

Ich wusste nicht, dass es da eine passende Library gibt... Das scheint mir das einfachste zu sein. Googeln hätte vielleicht geholfen. 1000 Dank für den Tipp!

Auch danke für die Fehlerhinweise, selbst wenn ich es jetzt per Library versuche. Sie bringen auf jeden Fall einen Lernfortschritt.

grundsätzlich ist es ja eine nette Fingerübung, aber wenns eh was fertiges gibt ...

Für die Verwendung der Seriellen Schnittstelle:

das Zerteilen hat dir eh schon combie gezeigt.
Einen Schritt davor setzt das Beispiel 5 aus dem obigen Tutorials an.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.