Forum: Compiler & IDEs serial String einlesen, wie?


von Holger Gerwenat (Gast)


Lesenswert?

Hallo,

könntet Ihr mir mal als Anfänger die Richtung weisen? Ich weiss, was
ich machen will, finde aber den Ansatz nicht so richtig.

Ich möchte GPS Daten im NMEA-0183 Format über die UART einlesen.

Nach Standard beginnt der Datenblock mit "$", dann kommen Gerätename
und Sequenzcode z.B. $GPGGA , dann die einzelnen Daten mit Komma
getrennt. OK! Also einzelnes Zeichen aus dem Lesepuffer holen und mit
dem jeweiligen gewünschten vergleichen. Ist "$GPGGA" gekommen kann
ich mit dem Ablegen der Daten anfangen. Das dachte ich könnte mit einer
Structur funktionieren. Mein Problem: Die Datenfelder können
unterschiedliche Länge haben, z.B. auch mal leer sein. Also wie kommen
nun die einzelnen ASCII Zeichen an die richtige Stelle in der Structur?
Gesendet werden sie ja von links nach rechts.

Hab ich mich irgenwie verständlich ausgedrückt, wo mein Problem liegt?

Mir würde sehr helfen, wenn Ihr mir einen Lösungsansatz zeigen könntet,
dann kann ich mal los programmieren.

Schon mal Danke!

Gruss Holger

Ach ja: Die ASCII Zeichen sollen an ein Display gesendet werden, erst
später will ich dann vielleicht mit rechnen und muss sie dann
umwandeln.

von Matthias (Gast)


Lesenswert?

Hi

wenn du nicht gerade den kleinsten AVR (also irgend einen mit SRAM)
hast:
Definier dir doch einen Puffer den du immer wenn ein '$' kommt
beginnst zu füllen. Ist das Telegramm beendet pfriemelst du den Inhalt
des Puffers auseinander.

Matthias

von Jimbo (Gast)


Lesenswert?

Also auf gut Deutsch eine Zustandsmaschine:
Auf Startzeichen warten ($) und dann die nächsten Zeichen vergleichen,
ansonsten das oder die gelesenen Zeichen verwerfen.
Am besten im Interrupt, dabei den Zustand über Flags festhalten.

von Jörg Wunsch (Gast)


Lesenswert?

state machine halte ich für den Anfang für reichlich übertrieben.
Matthias Vorschlag ging wohl eher davon aus, die Daten telegrammweise
in einen Puffer zu legen und die Verarbeitung danach ,,am Stück''
durchzuführen.

Für diese Verarbeitung kann man verschiedenste Methoden benutzen.
Wenn genügend ROM (und RAM) da ist, kann man sscanf() nehmen.
Andernfalls mit strtok() den String auseinanderfusseln und die Teile
mit atoi() in Zahlen wandeln.

von Jens Kapmeyer (Gast)


Lesenswert?

Ich glaube, Du suchst eine Grundidee als "start up".

In Deinem Fall ist das "auseinanderpfriemeln" der Daten ja relativ
einfach: Das $-Zeichen ist ja für dich immer der Start, und die
Kommazeichen läuten jeweils einen neuen Datenabschnitt ein.
Wenn Du also ein 2-dimensionales array anlegst:

unsigned char Daten[Max_Zahlenlaenge][Zahlen_pro_Telgramm];

würde deine Programmschleife etwa so aussehen können:


for(;;)              // forever
{
  temp = GetChar();  // oder wie die Empfangsroutine heisst ...
  if (temp == '$')
    {
      i=0;     // Zurück an den Anfang des Arrays
      j=0;     //
    }
  else
    {
    if (temp == ',')
      {
        i=0;   // nach einem Komma fängt die nächste Zahl an
        j++;   //
      }
   else
    {
     Daten[i][j]=temp  // weder '$' noch ',', dann als Daten
                       // eintragen
  }
}

Hier fehlen natürlich alle möglichen Abfragen gegen überlauf,
Plausibilitätsprüfungen, timeouts, das löschen alter Daten vom vorigen
Zyklus etc .... frohes Schaffen !

Gruß
Jens

von Holger Gerwenat (Gast)


Lesenswert?

Danke!

Das hilft mir weiter, so werd ichs mal probieren. Genau so ein Anfang
hat mir gefehlt.

Gruss Holger

von Alexander Höller (Gast)


Lesenswert?

Hallo,

auf Holgi's Elektronikseite gibt's nen Source, der genau das macht
was du willst - kannst dir ja mal anschaun ;)

http://home.t-online.de/home/holger.Klabunde/avr/avrboard.htm#GPSdisplay

mfG
aleX

von Holger Gerwenat (Gast)


Lesenswert?

Da sieht man mal wozu Holgis gut sind! grins und freu

Muss ich das Rad nich nochmal erfinden!

Danke!

Holger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.