Empfangsbuffer realisieren

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


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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren