Den NMEA0183 RMC Datensatz zerlegen

Hier nun das Programm zum Zerlegen des NMEA0183 RMC Datensatzes mit dem Arduino Uno.

Nach dem GGA Datensatz aus dem letzten Beitrag wird hier nun der RMC Datensatz ausgelesen.

// Hauptprogramm zum Testen der RMC NMEA Zerlegung
//
// Matthias Busse 30.3.2015 Version 1.0

int inByte, start=0;
String nmea = "NMEA Datensaetze zerlegen in die Bestandteile  Version 1.0  Matthias Busse"; // reservieren

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

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;
//      Serial.println(nmea); // alles auf Konsole ausgeben
      if (nmea.substring(3,6) == "RMC") {
        Serial.println(nmea); // auf Konsole ausgeben
        Serial.print(" RMC ");
        Serial.print("UTC: H ");
        Serial.print(getRMC_hour(nmea));
        Serial.print(" M ");
        Serial.print(getRMC_min(nmea));
        Serial.print(" S ");
        Serial.println(getRMC_sec(nmea));

        Serial.print(" Status ");
        Serial.println(getRMC_status(nmea));

        Serial.print(" Deg ");
        Serial.print(getRMC_LatDeg(nmea));
        Serial.print(" Min ");
        Serial.print(getRMC_LatMinInt(nmea));
        Serial.print(" Min.xxxx ");
        Serial.print(getRMC_LatMinFloat(nmea),4);
        Serial.print(" NS ");
        Serial.println(getRMC_LatNS(nmea));

        Serial.print(" Deg ");
        Serial.print(getRMC_LonDeg(nmea));
        Serial.print(" Min ");
        Serial.print(getRMC_LonMinInt(nmea));
        Serial.print(" Min.xxxx ");
        Serial.print(getRMC_LonMinFloat(nmea),4);
        Serial.print(" EW ");
        Serial.println(getRMC_LonEW(nmea));
        
        Serial.print(" Speed ");
        Serial.print(getRMC_Speed(nmea));
        Serial.print(" Kurs true ");
        Serial.println(getRMC_Course(nmea));

        Serial.print(" Datum Tag ");
        Serial.print(getRMC_Day(nmea));
        Serial.print(" Monat ");
        Serial.print(getRMC_Month(nmea));
        Serial.print(" Jahr ");
        Serial.println(getRMC_Year(nmea));
        
        Serial.print(" Mag. Variation ");
        Serial.print(getRMC_MagnVar(nmea));
        Serial.print(" EW ");
        Serial.println(getRMC_MagnEW(nmea));

        Serial.println();
      }
    }
  }
}

int getRMC_hour(String s) {
// Aus dem RMC Datensatz die Stunden in UTC auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//        --
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  return s.substring(k+1, k+3).toInt();
}

int getRMC_min(String s) {
// Aus dem GGA Datensatz die Minuten in UTC auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//          --
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  return s.substring(k+3, k+5).toInt();;
}

int getRMC_sec(String s) {
// Aus dem RMC Datensatz die Sekunden in UTC auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//            --
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  return s.substring(k+5, k+7).toInt();;
}

String getRMC_status(String s) {
// Aus dem RMC Datensatz den Status auslesen (A=activ | V=void)
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                   -
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  k = s.indexOf( ',',k+1);
  return s.substring(k+1, k+2);
}

int getRMC_LatDeg(String s) {
// Aus dem RMC Datensatz den Breiten Grad auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                     --
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  k = s.indexOf( ',',k+1);
  k = s.indexOf( ',',k+1);
  return s.substring(k+1, k+3).toInt();;
}

int getRMC_LatMinInt(String s) {
// Aus dem RMC Datensatz die Breiten Minuten auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                       --
// von Matthias Busse 29.03.2015 Version 1.0  
  int k = s.indexOf( ',',1);
  k = s.indexOf( ',',k+1);
  k = s.indexOf( ',',k+1);
  return s.substring(k+3, k+5).toInt();
}

float getRMC_LatMinFloat(String s) {
// Aus dem RMC Datensatz die Breiten Minuten mit Dezimalstellen auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                       -------
// von Matthias Busse 29.03.2015 Version 1.0  
  int k1 = s.indexOf( ',',1);
  k1 = s.indexOf( ',',k1+1);
  k1 = s.indexOf( ',',k1+1);
  int k2 = s.indexOf( ',',k1+1);
  return s.substring(k1+3, k2).toFloat();
}

String getRMC_LatNS(String s) {
// Aus dem RMC Datensatz die Breiten N oder S auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                             -
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<4;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+1, k+2);
}

int getRMC_LonDeg(String s) {
// Aus dem RMC Datensatz den Längen Grad auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                 ---
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<5;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+1, k+4).toInt();;
}

int getRMC_LonMinInt(String s) {
// Aus dem RMC Datensatz die Längen Minuten auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                    --
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<5;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+4, k+6).toInt();
}

float getRMC_LonMinFloat(String s) {
// Aus dem RMC Datensatz die Längen Minuten mit Dezimalstellen auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                    -------
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, k2, l;
  for(l=0;l<5;l++) { 
    k = s.indexOf( ',',k+1);
  }
  k2 = s.indexOf( ',',k+1);
  return s.substring(k+4, k2).toFloat();
}

String getRMC_LonEW(String s) {
// Aus dem RMC Datensatz die Länge E oder W auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                            -
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<6;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+1, k+2);
}

float getRMC_Speed(String s) {
// Aus dem RMC Datensatz die Geschwindigkeit auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                              -----
// von Matthias Busse 29.03.2015 Version 1.0  
int k1=1, k2, l;
  for(l=0;l<7;l++) { 
    k1 = s.indexOf( ',',k1+1);
  }
  k2 = s.indexOf( ',',k1+1);
  return s.substring(k1+1, k2).toFloat();
}

float getRMC_Course(String s) {
// Aus dem RMC Datensatz den Kurs auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                    -----
// von Matthias Busse 29.03.2015 Version 1.0  
int k1=1, k2, l;
  for(l=0;l<8;l++) { 
    k1 = s.indexOf( ',',k1+1);
  }
  k2 = s.indexOf( ',',k1+1);
  return s.substring(k1+1, k2).toFloat();
}

int getRMC_Day(String s) {
// Aus dem RMC Datensatz den Tag auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                          --
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<9;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+1, k+3).toInt();
}

int getRMC_Month(String s) {
// Aus dem RMC Datensatz den Monat auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                            --
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<9;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+3, k+5).toInt();
}

int getRMC_Year(String s) {
// Aus dem RMC Datensatz das Jahr auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                              --
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<9;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+5, k+7).toInt();
}

float getRMC_MagnVar(String s) {
// Aus dem RMC Datensatz die magnetische Variation auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                                 -----
// von Matthias Busse 29.03.2015 Version 1.0  
int k1=1, k2, l;
  for(l=0;l<10;l++) { 
    k1 = s.indexOf( ',',k1+1);
  }
  k2 = s.indexOf( ',',k1+1);
  return s.substring(k1+1, k2).toFloat();
}

String getRMC_MagnEW(String s) {
// Aus dem RMC Datensatz die Magnetische Variation E oder W auslesen  
// $GPRMC,105724.337,A,5415.6232,N,01004.9693,E,000.0,000.0,290315,002.1,E*65
//                                                                       -
// von Matthias Busse 29.03.2015 Version 1.0  
int k=1, l;
  for(l=0;l<11;l++) { 
    k = s.indexOf( ',',k+1);
  }
  return s.substring(k+1, k+2);
}

Links: GGA zerlegen und NMEA.de

Hardware: Arduino Uno Rev 3, GPS Antenne mit NMEA0183 Ausgang, Max232 Wandler
Software: Arduino 1.5.8

von Matthias Busse

Ein Gedanke zu „Den NMEA0183 RMC Datensatz zerlegen

  1. Pingback: Die NMEA GSV Datensätze vom GPS zerlegen | Shelvin – Elektronik ausprobiert und erläutert

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.