Forum: Mikrocontroller und Digitale Elektronik NMEA einlesen


von Markus (Gast)


Angehängte Dateien:

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

von A.K. (Gast)


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.

von Markus (Gast)


Lesenswert?

Hi!

Datensatz[100]=?0'; gibt nur eine Warnuns aus. Wenn ich 99
hineinschreibe, so ändert sich nichts. Wie sieht der Code für einen
Pufferüberlauf aus?

M.

von T.Stütz (Gast)


Lesenswert?

Wie wärs damit den rückgabe wert von getchar auch zu verwenden

Daten = getchar();

Gruss

von Markus (Gast)


Lesenswert?

In der if-Anweisung frage ich ab, ob ein Zeichen empfangen wurde. Was
kann man mit getchar() noch "anstellen"?

von A.K. (Gast)


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.

von A.K. (Gast)


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.

von Markus (Gast)


Lesenswert?

Hmmm? Nunja, ein Profi bin nun wirklich nicht. Aber nun ist es meine
Aufgabe dies zu machen. Ich werde aber mal die Hilfe bemühen.

von T.Stütz (Gast)


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

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.