www.mikrocontroller.net

Forum: Compiler & IDEs serial String einlesen, wie?


Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jimbo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Kapmeyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

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

Gruss Holger

Autor: Alexander Höller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/a...

mfG
aleX

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sieht man mal wozu Holgis gut sind! grins und freu

Muss ich das Rad nich nochmal erfinden!

Danke!

Holger

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.