Forum: Mikrocontroller und Digitale Elektronik Ringbuffer zur Datenübertragung


von Hans Wurst (Gast)


Lesenswert?

Hi, ich hab ne Frage zu der Uart-Library von Fleury. Es gibt dort 
fertige Functions

uart_init, uart_getXXX, uart_putXXX

Dazu hab ich ne Frage.  Es steht dort bei den Beschreibungen, dass das 
zu uebertragende Zeichen in einen Ringbuffer geschrieben wird bzw. aus 
einem Ringbuffer gelesen wird. Heisst das jetzt, dass dass die 
Funktionen aus dieser Bibliothek alles "automatisch" erledigen, also 
dass ich - je nach Größe des Ringbuffers - einfach X-Zeichen in den 
Buffer schreibe und die Zeichen "automatisch" nach und nach übertragen 
werden, ohne dass ich mich jetzt um den Kram kümmern brauch bzw. beim 
Lesen ähnlich? Diese Bibliothek automatisiert mir ggf. also alles?

von Hmm (Gast)


Lesenswert?

Was genau hindert Dich nun eigentlich Dir den Quelltext anzusehen und 
Dir Deine Frage selbst zu beantworten?

von Cyblord -. (cyblord)


Lesenswert?

Wofür soll denn eine Lib sonst da sein? Natürlich um bestimmte arbeiten 
abzunehmen.

von Hägar der Schreckliche (Gast)


Lesenswert?

Hmm schrieb:
> Was genau hindert Dich nun eigentlich Dir den Quelltext anzusehen und
> Dir Deine Frage selbst zu beantworten?

Niemand, und ich hab es auch gemacht und die einzelnen Schritte auch im 
Debug-Modus Schritt für Schritt verfolgt, aber manchmal bin ich mir 
unsicher, ob ich es richtig verstanden habe, und wenn ich dann von Euch 
Profis hier eine Bestätigung bekomm, ob meine Annahme richtig war, fühl 
ich mich einfach sicherer und freu mich, dass ich was neues gelernt und 
vlt. kapiert hab.

von Hmm (Gast)


Lesenswert?

>aber manchmal bin ich mir unsicher, ob ich es richtig verstanden habe

OK. Dann erkläre uns doch was Du genau untersucht hast um Deine Frage zu 
beantworten, was Du gefunden hast und inwiefern das Deine Frage 
beantworte und was die Antwort ist.
Dann können wir Dir (vermutlich) bestätigen, das wir zu dem selben 
Schluss gekommen sind oder auch nicht (und wenn, nein, warum nicht).

Aber so wie Du die Frage gestellt hast, liest sie sich als wenn Du 
selbst keinerlei Anstrengungen unternommen hast die Frage selbst zu 
beantworten.
OK. Du sagst, Du hast es doch getan. Dann dokumentiere das bitte.

von Stefan K. (sdwarfs)


Lesenswert?

Hans Wurst schrieb:
> Heisst das jetzt, dass dass die
> Funktionen aus dieser Bibliothek alles "automatisch" erledigen, also
> dass ich - je nach Größe des Ringbuffers - einfach X-Zeichen in den
> Buffer schreibe und die Zeichen "automatisch" nach und nach übertragen
> werden, ohne dass ich mich jetzt um den Kram kümmern brauch bzw. beim
> Lesen ähnlich? Diese Bibliothek automatisiert mir ggf. also alles?

Um's genau zu wissen, brauchen wir entweder den Quelltext oder die 
Dokumentation...

Ein Ringpuffer ist halt ein einfacher Puffer, der "überlaufen" kann. 
Also z.B. wenn der Empfangspuffer 16 Byte groß ist und Du nicht schnell 
genug die Daten "abholst" könnte, dann würde der Ringpuffer überlaufen.
Was dann genau passiert steht (hoffentlich) in der Dokumentation. Es 
kann z.B. sein, dass dieser Zustand "ignoriert" wird. Dann bekommst Du 
Datensalat beim Lesen... oder es wird festgestellt und Du bekommst eine 
Meldung für den Pufferüberlauf und musst evtl. den Puffer 
"zurücksetzen". Weitere Varianten sind denkbar...
Der Puffer kann beim Lesen auch "unterlaufen", d.h. Du versuchst Daten 
zu lesen, aber es sind noch keine empfangen worden. Auch hier kann der 
Aufruf blockieren (Anwendung hängt, bis Daten empfangen worden sind - 
mit etwas Pech, wenn die Verbindung gestört ist bis in alle Ewigkeit). 
Oder die Funktion liefert einfach unsinnige Daten oder "-1" oder "0" 
zurück. Meist kann man abfragen, ob schon Daten im Puffer sind. Und das 
Problem so umgehen.

Auch beim Versand gibt es verschiedene Möglichkeiten: Wenn noch 16 
unversendete Bytes im Puffer wären und Du weiter hinein schreibst, 
könnte entweder das Problem ignoriert werden (dann überschreibst Du die 
noch ungesendeten Daten)... oder es wird ein Pufferüberlauf gemeldet und 
du darfst wieder die Verbindung "zurücksetzen"... oder aber der 
Schreibaufruf "blockiert".

Wenn der Aufruf blockiert (wartet bis Daten da sind oder in den Puffer 
geschrieben werden können), nennt man die Art der Verarbeitung 
"synchron" oder "blocking".

Wenn der Aufruf nicht blockiert ist die Verarbeitung "asynchron" oder 
"non blocking".


ALSO: Es gibt also verschiedene Varianten. Und wie die Bibliothek zu 
benutzen ist, sollte in der Doku stehen. Vielleicht gibt es auch 
Beipielprogramme... an denen sieht man am schnellsten, wie mit den 
obigen Problemen umzugehen ist.

Soo... Ich denke das sollte für's erste reichen. Damit solltest Du genug 
Wissen haben, um heraus zu finden, was die Bibliothek tut.

Grüße,
Stefan

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.