Empfangsbuffer realisieren

Gast #465772
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


Gast #465774
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....
Gast #465811
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 :-(
Gast #465821
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 :-(
Gast #465834
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...
Gast #465840
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
Gast #465850
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.