Forum: Mikrocontroller und Digitale Elektronik String mit variabler Breite über USART empfangen/senden


von Markus Dost (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich beschäftige mich gerade mit dem Senden und Empfangen von Strings 
über den UART eines Atmega32. Die hier im Forum dafür verfügbaren 
Tutorials hab ich durchgearbeitet und bei festgelegter String-Länge auch 
Erfolg gehabt.

Lasse ich die Stringlänge veränderlich, sodass man eine beliebig lange 
Zeichenkette im Hyperterminal eingeben und sie mit "Enter" abschließen 
kann, kommt es zu "Phänomenen", die ich mir im Moment noch nicht 
erklären kann:

- wurden nur 2 Zeichen eingegeben und mit Enter abgeschlossen, wird bei 
der Ausgabe nach den 2 Zeichen ein Smilie ausgegeben
- nach der Eingabe des dritten Zeichens wird die Variable 
"uart_str_complete" überschrieben (bisher sind die Hex-Werte 48 und 54 
aufgetreten), sodass die Zeichenkette auf 3 Zeichen begrenzt ist
- bei der anschließenden Ausgabe ins Hypterminal wird zusätzlich zu den 
3 Zeichen noch ein Herz ausgegeben
- wird direkt anschließend nur ein Zeichen eingeben und mit Enter 
abgeschlossen, werden die ersten beiden Zeichen der letzten Eingabe und 
ein Smilie ausgegeben

Wahrscheinlich habe ich nur einen ganz dummen Fehler gemacht, aber im 
Moment hab ich keinerlei Idee und wäre über Lösungvorschläge dankbar.
Ein Beispielprogramm befindet sich im Anhang.

Gruß,
Markus

von Carsten W. (eagle38106)


Lesenswert?

1
volatile unsigned char uart_eingabe[]= "";

Da liegt der Hase im Pfeffer: Die Eingabe-Variable ist nur als 
Leerstring definiert, d.h. die Puffergröße ist ein Byte! Was dahinter 
liegt, wird vom Programm überschrieben.
1
volatile unsigned char uart_eingabe [20]= "";

schafft Platz für 20 Zeichen incl. abschließender '\0'. Danach läuft der 
Puffer über.

von Markus Dost (Gast)


Lesenswert?

Damit wäre die Zeichenkette in ihrer Länge aber begrenzt. Mein Ziel war, 
die Länge der Kette dynamisch zu gestalten, um das Programm universell 
einsetzen zu können. Ist so etwas überhaupt möglich?

von Karl H. (kbuchegg)


Lesenswert?

Markus Dost schrieb:
> Damit wäre die Zeichenkette in ihrer Länge aber begrenzt.

Ja, das ist so

> Mein Ziel war,
> die Länge der Kette dynamisch zu gestalten, um das Programm universell
> einsetzen zu können. Ist so etwas überhaupt möglich?

Möglich schon.
Aber das willst du dir zur Zeit noch nicht antun. Und schon gar nicht 
auf einem AVR, bei dem man um dynamische Speicherallokierung einen Bogen 
macht, wie der Teufel ums Weihwasser.

von Markus Dost (Gast)


Lesenswert?

Alles klar, dann brauch ich jetzt auch nicht weiter probieren.

Danke

von Karl H. (kbuchegg)


Lesenswert?

Aus genau diesem Grund ist auch in der Originalroutine eine 
Überlaufsicherung drinnen, die verhindert dass schlimmeres passiert (zb 
das was du gesehen hast), wenn der Benutzer auf der Tastatur einschläft 
und damit der Buffer im Programm zu klein ist.

Leider hast du die Sicherung entfernt.
Hmm. Eigentlich 'Gott sei Dank' hast du die Sicherung entfernt. Denn 
dadurch hast du am eigenen Leib erfahren, was alles passieren kann, wenn 
dieser Buffer überläuft und das diese Sicherung schon ihren Sinn hat.

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.