mikrocontroller.net

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


Autor: Markus Dost (Gast)
Datum:
Angehängte Dateien:

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

Autor: Carsten Wille (eagle38106)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
volatile unsigned char uart_eingabe [20]= "";

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

Autor: Markus Dost (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Markus Dost (Gast)
Datum:

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

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.