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