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
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.
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?
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.
Alles klar, dann brauch ich jetzt auch nicht weiter probieren. Danke
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.