Forum: Mikrocontroller und Digitale Elektronik Empfangsbuffer realisieren


von Peter K. (Gast)


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



von Peter Z. (Gast)


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....

von Dieter (Gast)


Lesenswert?

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

von Peter K. (Gast)


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 :-(

von Ulrich (Gast)


Lesenswert?

In allen "gefährlichen Momenten" kann man den Interupt sollange 
deaktivieren

von Peter K. (Gast)


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 :-(

von unbeschreiblicher Rahul (Gast)


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...

von rene (Gast)


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

von Thomas (Gast)


Lesenswert?

rene schrieb:

> Ich lass jeweils noch eine Protokollstatusmaschine im Interrupt mitlaufen.

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

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
Noch kein Account? Hier anmelden.