- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: NMEA von GPS-Modul auswerten

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277

    NMEA von GPS-Modul auswerten

    Anzeige

    Powerstation Test
    Nabend,

    Ich habe ein GPS Modul an einem AVR, welchen ich mit C programmiere. Desweiteren befinden sich am ATmega16 ein 16*2 LCD, womit ich mal die Längen und Breitengrade angeben möchte.
    Wie man die Daten ausliest, ist mir klar.
    Für Längen und Breitengrade kann ihc ja z.B. die Zeile "$GPGGA" verwenden. Nun muss ich ja theoretisch nur noch die Komata zählen, bis zu der Zahl, die ich gerne hätte.
    Jedoch weiss ich nicht, wie ich genau die Zahl nach dem Komma (bzw. zwischen zwei Komata) in eine Variable einlesen kann.

    Kann mir jemand weiterhelfen?


    Mfg JeyBee

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Jedoch weiss ich nicht, wie ich genau die Zahl nach dem Komma (bzw. zwischen zwei Komata) in eine Variable einlesen kann.
    Du nimmst die einzelnen ASCII Zeichen zwischen den gewünschten kommas und kopierst die in eine String Variable.

    Nun benutzt Du das Kommando atoi das Dir dann diesen String in eine Variable umwandelt.
    Du müsstest nur darauf achten, das die Variable auch einen genügend großen Umfang hat ( Anzahl der BITS )

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.09.2004
    Ort
    Heilbronn
    Alter
    41
    Beiträge
    153
    Hallo JeyBee,

    ich gehe mal davon aus, dass der GPS via RS232 mit deinem AVR verbunden ist.
    Wenn ich mich richtig entsinne, kommen die Daten ja als ASCII-Zeichen rüber.

    Ich würde das Ganze so angehen:
    1. Die ASCII-Zeichen (sind ja nix weiter als einzelne Bytes) nacheinander in ein char-Array ablegen.

    2. Das char-Array durchgehen und überall die 48 abziehen (Umwandlung ASCII->Zahl)

    3. Dann das Array nochmals durchlaufen und die einzelnen Ziffern aufsummieren (1. Stelle * 1000 + 2. Stelle * 100 ... 1. Nachkommastelle * 0,1 ...) und das Ergebnis in eine float schreiben

    Natürlich kannst du die einzelnen Schritte auch in einem Durchlauf machen.

    Grüße,
    Marco
    It is a job that is never started that takes the longest to finish - J.R.R. Tolkien

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.09.2004
    Ort
    Heilbronn
    Alter
    41
    Beiträge
    153
    @wkrug:

    atoi eignet sich nur für Integer. Wenn dann müsste er atof nutzen.
    Allerdings würde ich in diesem Fall davon abraten, da die Funktion nicht sonderlich effizient ist.

    Mal davon abgesehen ist der Lerneffekt natürlich größer, wenn man es mal selber implementiert hat

    Grüße,
    Marco
    It is a job that is never started that takes the longest to finish - J.R.R. Tolkien

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    Nabend

    Das mit dem Char array, war auch meine Überlegung. Da ich jedoch auf dem Gebiet Funktionen, Arrays, Buffer etc. noch nicht viel Ahnung habe, wolle ich nur mal jeweils den Zeilenanfang "$GPGGA" auf mein LCD Display zaubern. Jedcoh geht auch das schon nicht ganz:

    Nach dem Reset des Controllern, funktionert alles einmalig perfekt. "$GPGGA" wird korrekt in das Char-Array eingelesen, über ein paar if-schleifen und die strcmp(); funktion wird überprüft, ob in dem char array auch "$GPGGA" steht. Nun mien Problem:
    Nachdem das alles einmalig gut funktionierte, wird zwar wieder "$GPGGA" in ein Char-Array eingelesen, jedoch ist alles auf zwei Arrays aufgeteilt, wodurch ich nichts mehr auf dem Display erhalte.
    Wie kann ich das Problem lösen?

    Hier mein Code:
    http://pastebin.com/m2d23eac2


    Mfg JeyBee

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    @maw_hn
    Es kommt eben auf den Wertbereich an, der in die Variable rein soll.
    bei Integer sind es 65536.
    Bei Float hat man halt das Problem mit den Rundungsfehlern.

    Eventuell würde ja auch eine Long Variable reichen, dann müsste das Kommando atol benutzt werden.

    Zum Problem mit dem String.
    Am Ende des Strings wird doch immer ein <CR> bzw. <CR>,<LF> ausgegeben.
    Du startest die Aufzeichnung des Strings mit dem $ und zeichnest alles auf, bis ein <LF> kommt.
    Ist dieses Da wird der komplette String ausgewertet.
    CRC usw.
    Ein $ veranlasst den Stringzähler dazu imme auf Position 0 zu springen.
    Somit werden nur gültige Strings ausgewertet und es ist immer nur einer im Buffer.
    Ist es dein gewünschtes Positionskommando angekommen, werden die Daten aus dem String geholt und für die weitere Verarbeitung abgespeichert.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    Hat mir villeicht mal jemand eine Source oder so?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    folgende funktionen solltest du dir eventuell mal ansehen
    Code:
    size_t strcspn ( const char * str1, const char * str2 );
    const char * strrchr ( const char * str, int character );
    const char * strstr ( const char * str1, const char * str2 );
    char * strtok ( char * str, const char * delimiters );
    vor allem die letzte methode sollte für dich überaus hilfreich sein!!!
    http://www.cplusplus.com/reference/clibrary/cstring/
    zum nachlesen

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    Okay, das scheint hilfreich zu sein.

    Aber what the hell ist char* xxx. *x ist ja ein pointer.
    Ist char *string z.B. ein pointer im char format, mit dem Namen string?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    wo der punkt steht ist von mäßige bedeutung, nach konvention schreibt man beim DEKLARIEREN eines pointer

    type* name;

    wenn man dann

    *name

    schreibt, dereferenziert man den pointer und greift auf den inhalt zu!

    das const kann man bei diese methoden zumindest ignorieren

    deine aussage

    "Aber what the hell ist char* xxx. *x ist ja ein pointer. " ist also nicht ganz richtig, dein xxx ist der name des pointer *x ist der dereferenzierte pointer

    MfG

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen