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

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