www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Empfangsbuffer realisieren


Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte einen UART Empfangsbuffer realisieren.

Vorstellen kann man sich das ganze System als dezentralen Datenlogger 
mit zentralen Bediensystem. Der Controller im Bediensystem sammelt also 
sämtliche Informationen der dezentralen Einheiten. Der UART läuft mit 
115200baud (via RS485).
Nun möchte ich natürlich keine Informationen verlieren; wie folgt würde 
ich den Empfangsbuffer realisieren.

[code]
...
char uart_interrupt[128]={'\0'};
char uart_main[128]={'\0'};
...
ISR uart --> hängt empfangenes Zeichen an uart_interrupt an....
...
in der Main Schleife wird der uart_interrupt auf neues Zeichen geprüft 
(durch int-Variable, die aktuelle Position im Buffer enthält) und das 
neue Zeichen an die Variable uart_main angehängt sowie aus dem 
uart_interrupt entfernt. Danach wird uart_main auf vollständigen 
Datensatz geprüft. Wie ich das mache weiß ich noch nicht, denn ich habe 
keinen Begin respektive End-Character. Prinzipiell - kann ich den Buffer 
so realisieren oder wäre das grob-fahrlässig-unsauber? ;-)

grüße und vielen Dank



Autor: Peter Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

beim Codevision C-Compiler kannst dir einen Code erzeugen lassen für 
UART mit Buffer Interrupt basiert. Da kannst ja dann ein wenig spicken 
;-)
Müßte auch mit der kostenlosen EVAL Version funktionieren....

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß nicht was du mit anhängen meinst,
jedenfalls empfiehlt sich da ein Ringbuffer

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ein Ringpuffer ergibt sich mehr oder weniger von selber.
Mir geht es mehr oder weniger um die saubere Lösung zwischen "Zeichen 
empfangen" bis hin zu "Zeichen auswerten". Denn ich habe bedenken, dass 
im selben Moment, wo ich ein Zeichen auswerte das nächste Zeichen kommt 
- und da hörts dann auch schon auf :-(

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In allen "gefährlichen Momenten" kann man den Interupt sollange 
deaktivieren

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon, dass kann man machen. Aber was, wenn genau zwischen dem "cli" und 
"sei" ein Zeichen ankommt? Dann ist es quasi im Nirvana - für immer :-(

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soviel Pädagogen-Gewäsch hab ich ja lange nicht mehr gelesen.
Der Ablauf sieht so aus:
In der ISR wird ein Zeichen empfängen.
Dieses wird in den Puffer geschrieben. Dazu muß man sich natürlich mit 
einem Index die aktuelle Schreibposition merken.
Der Index wird nach dem Schreiben um eins erhöht.
Wenn der Index das obere Ende des Puffers erreicht hat, wird er auf den 
Anfang zurückgesetzt - damit ergibt sich dann der Ringpuffer.
Im Hauptprogramm wird dann überprüft, ob sich neue Daten im Puffer 
befinden.
Sollte das der Fall sein, werden sie bearbeitet.
Dazu braucht man natürlich einen Lese-Index.
Manche zählen auch noch die Elemente im Puffer.
Das einzige Problem, das sich ergibt sind Pufferüberläufe, wenn das 
Hauptprogramm nicht mit dem "Leeren" des Puffers hinterherkommt...

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
115kbaud ist ein byte alle 100us, das sind ja Ewigkeiten. Da muesste man 
doch mitkommen, speziell mit einem Interrupt receiver. Ich lass jeweils 
noch eine Protokollstatusmaschine im Interrupt mitlaufen.

rene

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rene schrieb:

> Ich lass jeweils noch eine Protokollstatusmaschine im Interrupt mitlaufen.

Kannst du das mal kurz erläutern? Vor allem mit dem "mitlaufen".

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.