Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Wie kann ich die einzelnen NMEA-Werte mit C auslesen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.05.2005
    Beiträge
    24

    Wie kann ich die einzelnen NMEA-Werte mit C auslesen?

    Beispiel (Eingabe):
    $GPGGA,214735.000,4759.6023,N,00753.6202,E,1,08,1. 1,0362.2,M,47.9,M,,*62

    Wie komm ich an die einzelnen Werte, die mit Kommas getrennt sind, heran?
    Gibt es in C einen Befehl, mit dem man die Kommas zählen kann?
    Oder habt ihr andere Vorschläge diese Aufgabe zu lösen?
    Gibt es vielleicht Beispielprogramme falls jemand ein ähnliches Problem hatte?

    Vielen Dank für Eure Hilfe

  2. #2
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Vieleiht gehts mit sscanf()? sscanf( str, "%s,%f,%f...", ... )
    Sonst halt mit strchr immer den nächsten ',' suchen und einen pointer vom letzten zahlenstückanfang gemerkt haben und dann dass ',' mit '\0' ersetzen und atoi() bzw. atof() u.d.G. verwenden.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  3. #3
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Du kannst Dir mit strstr oder strtok und den anderen string-Funktionen von C eine Funktion basteln die wie in Scriptsprachen einen String anhand eines Zeichens zerlegen und alle Werte dazwischen in ein Array schreiben (explode- oder split-Funktion).
    Dann kannst Du auch mitzählen wie viele splits Du gemacht hast.
    I haven't lost my mind - It's somewhere on a backup-disc

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von SeeksTheMoon
    Du kannst Dir mit strstr oder strtok und den anderen string-Funktionen von C eine Funktion basteln die wie in Scriptsprachen einen String anhand eines Zeichens zerlegen und alle Werte dazwischen in ein Array schreiben (explode- oder split-Funktion).
    Dann kannst Du auch mitzählen wie viele splits Du gemacht hast.
    Schon, nur würd ich niemanden raten eine Funktion wie strtok zu verwenden. Denn ich finde die ist ein schlechtes Beispiel. Mit static Variablen. Du kanns't nicht mehr als einen String zu selben Zeit splitten.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hi,

    für Anhänger der "reinen Lehre" oder wenn man wirklich mal mehrere Strings gleichzeitig parsen möchte (kann ja auch mal bei multi-threaded Anwendungen unbewusst passieren) gibts die meisten Funktionen auch mit der Endung *_r für reentrant.
    Also statt strtok verwendet man einfach strtok_r.

    Viele Grüsse

    almoeli

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.05.2005
    Beiträge
    24

    zum NMEA-Nachrichten Problem

    Untenstehenden Quellcode habe ich nun benutzt. Nun wollte ich ihn aber etwas vereinfachen und nicht so viele if-Abfragen verwenden. Kann man die einzelnen Zeiger (pcNachricht[3-5]) zu einem String zusammenführen? So dass ich nur eine If-Anweisung benötige?
    int j =0;
    int i;
    int g =0;
    for(i=0;i<81;i++)
    {
    if (*(pcNachricht+i)==0)
    break;
    if (pcNachricht[3]=='R')
    if (pcNachricht[4]=='M')
    if (pcNachricht[5]=='C')
    while(g<7)
    {
    j++;
    if (pcNachricht[j]==',')
    g++;
    if (g==7)
    {
    printf("Geschwindigkeit: ");
    while(pcNachricht[j+1]!=',')
    {
    j++;
    printf("%c", pcNachricht[j]);
    }
    printf("Knoten\n");
    }
    }

    }



    Vielen Dank.

  7. #7
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Code:
    if (strstr(pcNachricht, "RMC") == &pcNachricht[3])

  8. #8
    Registrierter Benutzer
    Registriert seit
    02.05.2005
    Beiträge
    24
    Vielen Dank!
    Leider bin ich schon wieder auf ein neues Problem gestossen:
    Mit dieser Anweisung (float)atof((char *)pubyNachricht+7); wandel ich den String nach dem 1. Komma in einen Float um. Nun will ich nach jedem Komma die Anweisung wiederholen, um die anderen Werte auch in einen Float umzuwandeln. Doch wie komm ich zu den anderen Werten? Vielleicht mit einem Befehl zum nächsten Komma "springen"?
    Eine Beispiel-NMEA Nachricht sieht folgendermassen aus:
    $GPRMC,211155.000,A,4759.6286,N,00750.7149,E,15.6, 292.1,110305,0.0,W*49

    Habt Ihr da eine Idee?

    Vielen Dank!

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    strtok oder strtok_r, wenn es reentrant sein muss.

    scanf sollte doch auch gehen, oder nicht?

  10. #10
    Registrierter Benutzer
    Registriert seit
    02.05.2005
    Beiträge
    24
    Vielen Dank!!

    Noch eine kleine Frage, ich will in einer Header-Datei in einer Struktur eine int Variable initialisieren mit einem neg. Wert.
    Folgende Variable soll initialisiert werden: int Variable;
    Ich schrieb einfach int Variable = -1; , doch dies war nicht compilierbar.

    Danke!

  11. #11
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von martin-harry
    Vielen Dank!!

    Noch eine kleine Frage, ich will in einer Header-Datei in einer Struktur eine int Variable initialisieren mit einem neg. Wert.
    Folgende Variable soll initialisiert werden: int Variable;
    Ich schrieb einfach int Variable = -1; , doch dies war nicht compilierbar.

    Danke!
    Sicher das DORT der Fehler lag? Oft wird er zwar dort angezeigt, ist aber ein Fehler an viel früherer Stelle.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  12. #12
    Registrierter Benutzer
    Registriert seit
    02.05.2005
    Beiträge
    24
    Hi panzi,

    es ist aber ohne eine initialisierung compilierbar...
    Weiss auch nicht wie ich das nun machen soll...?
    Das problem ist nämlich folgendes:
    Ich muss innerhalb einer Schleife eine Zuweisung nur beim ersten Durchlauf machen, kann aber nichts ausserhalb der Schleife machen. Meine Idee war es nämlich eine Initialiesierung mit -1 zu machen und in der Schleife dann eine If-Abfrage ob der Wert positiv ist und dann einen positiven Wert zuweisen.
    Weiss nicht ob diese Idee sinnvoll ist oder nicht, aber ich hab einfach keine andere Idee. Gibt es sowas ähnliches wie eine Singelton Konstruktion?

    Oder hast du, oder Ihr eine andere Idee?

    Vielen Dank!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •