NMEA einlesen

Gast #159020
Lesenswert?

Moin,Moin!

Ich versuche NMEA-Daten via UART in einen AVR einzulesen. Dazu verwende
ich zunächst ein Terminal, welches vorhandene Datensätze zum uC sendet.
Zur Bestätigung soll der uC diese Datensätze zurücksenden.

Mein bisheriger Code hat nicht richtig funktioniert. Was haltet Ihr
davon? Kann ihn erst heute Nacht testen.

Oder kann es auch daran liegen, daß irgendwann die Variable Datensatz
voll ist und ausgegeben werden soll. Dabei wird aber weiterhin in ihr
hinein geschrieben. Obwohl ich das als nicht unbedingt plausibel
halte.

Teilweise kam aber nach einen Reset der erste Datensatz richtig an und
die folgenden zeigten nur noch Fragmente des Originals.

Kennt jemand vieleicht eine Quelle für solchen Code? Dürfte ggf.
Standardcode sein.

Vielen Dank im Voraus, werde heute Nacht alles checken!

Gruß Markus
Angehängte Dateien:
Gast #159021
Lesenswert?

> char Datensatz[100];
> Datensatz[100]='\0';

"Datensatz" hat 100 Elemente, numeriert von 0..99. Das Element 100
gibt's nicht => überschreibt das was dahinter steht.

Und ein Test auf Pufferüberlauf muss natürlich noch rein.
Gast #159025
Lesenswert?

Du hast aber schon nachgelesen, was genau getchar() eigentlich macht?
Warum also ein "nackter" Aufruf vom getchar() zwar etwas bewirkt,
aber mit an Sicherheit grenzender Wahrscheinlichkeit nicht das, was Du
im Sinn hast.
Gast #159026
Lesenswert?

Auch wenn's hier oft anders zu laufen scheint - ich denke dass ein
Microcontroller nicht die beste Plattform für die ersten Schritte in
der Programmierung mit C ist. Es sei denn man hat JTAG und weiss damit
umzugehen, ansonsten ist das für Anfänger zu sehr Blindflug.
Gast #159028
Lesenswert?

@Markus
natürlich kannst du mit "getchar()" prüfen ob ein Zeichen da ist,
(genauer du wartest auf das nächste Zeichen)
dieses Zeichen wird als Rückgabewert zurückgegeben.
Wenn das Zeichen nicht zufälligereise 0x00 ist geht das gut.

Aber: danach hast du eine while schleife die dir den Hauptspeicher mit
'$' auffüllt da an "Daten" nix mehr zugewiesen wird, Daten muß aber
um zu dieser Stelle zu kommen '$' sein (if).

=> vermutlich neustart Prozesor da du dir früher oder später
wichtige Daten überschreibst (Stack).

Tip1: Klammern um Abfragen helfen ungemein beim Lesen des Codes
Tip2: es gibt Debugger/Simulatoren die dir bei der Entwicklung helfen
könnten. Wenns da nix gibt, nimm dir nicht benützten Pin(s) und gib da
ein Signal aus (z.B: Bin jetzt innerhalb if () )

Gruss

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren