www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GPS NMEA Daten trennen


Autor: Bach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich empfange bereits meine GPS Daten mit meinem µC und speicher sie in 
einem string. Dieser wird dann unverändert zurückgesendet. Nun wollte 
ich wissen wie ich in C meine empfangenen Daten, ein Beispiel:

$GPGGA,175827,4444.5956,N,55555.3461,E,1,05,02.8,00059.5,M,043.1,M,,*41

trennen kann. Jeder der einzelen 15 Werte, die von kommas getrennt 
werden, soll in einer eigenen Varibalen abgespeichert werden.

Wie soll ich dann rangehen in C????? kleinen Tipp bitte

Meine Überlegung war es die Postion der Kommas im string abzuspeicher 
und die Werte so einzeln abzuspeichern, gibts vielleicht eine bessere 
Lösung???

Autor: Aahh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einer Zustandsmaschine den string absuchen und decodieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bach schrieb:

> Meine Überlegung war es die Postion der Kommas im string abzuspeicher
> und die Werte so einzeln abzuspeichern, gibts vielleicht eine bessere
> Lösung???

Kommt drauf an, was du dann weiter machen willst.

Mittels strtok() kann man den String zb in Einzelteile aufsplitten und 
sich jeweils Pointer auf die Teilstrings merken. Man könnte auch mit 
strchr() die Positionen der Kommas rausfiltern und mit strncpy() die 
Einzelteile in neue String-Variablen rauskopieren. Oder bei den 
Zahlenkomponenten einen atoi gleich auf die Stringpositionen nach dem 
Komma ansetzen oder die eierlegende Wollmilchsau sscanf drauf ansetzen 
oder ....

Autor: Bach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hatte das schon scanf probiert

z.b.:
char wert1, wert2, wert3, wert4, wert5;

scanf("%s,%s,%s,%s,%s", &wert1, &wert2, &wert3, &wert4, &wert5);

printf("%s",wert1);
printf("%s",wert2);
printf("%s",wert3);
printf("%s",wert4);
printf("%s",wert5);

Aber da schmiert mir bei der Probe Dev-C++ ab :-(

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char wert1, wert2, wert3, wert4, wert5;


Seit wann ist ein char ein String?

Autor: Bach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
falsch kopiert aber hab trotzdem char davor.
was muss da sonst hin???

char wert1[10];
char wert2[10];
char wert3[10];
char wert4[10];
char wert5[10];

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Kommt drauf an, was du dann weiter machen willst.
>
> Mittels strtok() kann man den String zb in Einzelteile aufsplitten und
> sich jeweils Pointer auf die Teilstrings merken. Man könnte auch mit
> strchr() die Positionen der Kommas rausfiltern und mit strncpy() die
> Einzelteile in neue String-Variablen rauskopieren. Oder bei den

Im Prinzip schon die Vorgehensweise, die ich auch wählen würde, aber 
vielleicht ein wenig zu "oversized". Ich würde einfach nach den 
Komma-Positionen mit Hilfe des ASCII-Codes suchen - also nach der 0x2c, 
mir gleichzeitig die Abstände merken und dann die Teilstrings 
rauskopieren. Und dann halt mit atoi() in ein Integer umwandeln oder 
wieder per ASCII (x-48*10^z; z = Stelle) berechnen:

Eine 12 wäre in ASCII dann [49 | 50]. Die Umrechnung 
((50-48)*1)+((49-48)*10) ergibt dann 12.

Man müsste mal schauen, ob das dann vielleicht etwas platzsparender 
wäre, als die entsprechenden Bibliotheksfunktionen zu benutzen...

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bach schrieb:
> hatte das schon scanf probiert

Warum nicht sscanf()? scanf() liest vom stdin. Wenn Du einen String 
auslesen willst, dann solltest Du sscanf() benutzen.

Also so:
sscanf(quellstring, "(%i,%i,%i)", &int_wert1, &int_wert2, &int_wert3);

oder:
sscanf(quellstring, "(%s,%s,%s)", string_pointer1, string_pointer2, string_pointer3);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bach schrieb:
> falsch kopiert aber hab trotzdem char davor.
> was muss da sonst hin???

Es ist immer schwer, in falsch ins Forum kopiertem Nicht-Quelltext 
Fehler zu finden :-)

> aber vielleicht ein wenig zu "oversized".

Möglich.
Auf der anderen Seite werden die Stringfunktionen hier so oft benutzt, 
dass das bischen Overhead das Kraut wahrscheinlich nicht fett machen 
wird.

Man könnte auch so etwas machen

char Id[10];
char Timestring[10];
char Latitude[10];
char North[5];
char Longitude[10];
char East[5];

char* Extract( char * From, char * To )
{
  if( From ) {
    while( *From && *From != ',' )
      *To++ = *From++;
  }

  *To = '\0';

  if( From && *From )   // skip ',' if it is there (not end of string)
    From++; 

  return From;
}

int main()
{
  char Record[] =
    "$GPGGA,175827,4444.5956,N,55555.3461,E,1,05,02.8,00059.5,M,043.1,M,,*41";

  char* tmp = Record;
  tmp = Extract( tmp, Id );
  tmp = Extract( tmp, Time );
  tmp = Extract( tmp, Latitude );
  tmp = Extract( tmp, North );
  tmp = Extract( tmp, Longitude );
  tmp = Extract( tmp, East );
  ...

und hätte damit Kopieren und Erkennen des ',' in einem Rutsch erledigt 
(Fehlerbehandlung wäre noch verbesserungswürdig)

Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum erfindet Ihr immer alles von neuem? Ich meine, GPS-Parser gibts 
wie Sand am Meer. zB Gpsbabel.

-Michael

Autor: JJJ (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
c sample mit code::blocks

rfc

Autor: Aahh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Thema ist dermassen von trivial... zwischen zwei kommas hat's ne 
zahl...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das Thema ist dermassen von trivial... zwischen zwei kommas hat's ne
>zahl...

Nicht unbedingt. Aber selbst in Assembler hatte ich damit keine 
Probleme.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.