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
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....
ich weiß nicht was du mit anhängen meinst, jedenfalls empfiehlt sich da ein Ringbuffer
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 :-(
In allen "gefährlichen Momenten" kann man den Interupt sollange deaktivieren
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 :-(
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.