USART Empfangsbuffer

Gast #2827823
Lesenswert?

Hallo,

Wie kann man in einem Empfangsbuffer mit, sagen wir mal 20 Chars einen 
String von z.B. 5 Chars aus diesem Buffer finden (bis hier noch kein 
Problem, mit Stringcompare geht das super) und anschließend aus diesem 
Buffer löschen? Ziel ist, ich möchte unterschiedlich lange 
Steuerkommandos an den uC senden. Er darf dieses Steuerkommando aber nur 
einmal ausführen. Folglich muss es nach Abarbeitung wieder raus aus dem 
Buffer. Bei dem Buffer handelt es sich um ein FIFO.

Wenn ich einen Befehl im Buffer finde, wie kann ich dann die Länge 
dieses Strings bestimmen, damit ich halt die letzten Befehle wieder aus 
dem Speicher ziehen kann? Wenn ich einen Befehl habe, kann ich doch 
eigentlich mit sizeof des vergleichsstrings die Größe ermitteln und 
diese dann aus dem Buffer löschen. Was aber, wenn in der Zeit nach dem 
Empfang und des Kompares ein weiteres Zeichen eintrifft, dann würde ich 
es ja schlimmstenfalls mitlöschen weil der eigentliche Befehl schon ein 
weiter gerutscht ist?


Ingo
#2827827
Lesenswert?

@  Ingo (Gast)

>Wie kann man in einem Empfangsbuffer mit, sagen wir mal 20 Chars einen
>String von z.B. 5 Chars aus diesem Buffer finden (bis hier noch kein
>Problem, mit Stringcompare geht das super)

Nö, den du hast bei einem FIFO gar keinen direkten Zugriff auf die 
Daten, du kannst sie nur der Reihe nach auslesen.

>Buffer löschen? Ziel ist, ich möchte unterschiedlich lange
>Steuerkommandos an den uC senden. Er darf dieses Steuerkommando aber nur
>einmal ausführen. Folglich muss es nach Abarbeitung wieder raus aus dem
>Buffer.

Nö, VOR der Abarbeitung. Deine UART-Empfangsroutine schreibt die Daten 
in den FIFO, eine andere Auswerteroutine liest die Daten aus dem FIFO 
Zeichen für Zeichen und dekodiert die Befehle. Damit wird der Befehl 
automatisch aus dem FIFO entfernt. Nach der Dekodierung erfolgt die 
Befehlsausführung.

>Wenn ich einen Befehl im Buffer finde, wie kann ich dann die Länge
>dieses Strings bestimmen,

Indem du beim Auslesen mitzählst.

> damit ich halt die letzten Befehle wieder aus
> dem Speicher ziehen kann?

???
Da wird gar nichts gezogen. Siehe oben.

> Wenn ich einen Befehl habe, kann ich doch
>eigentlich mit sizeof des vergleichsstrings die Größe ermitteln und
>diese dann aus dem Buffer löschen.

Falscher Ansatz. Siehe oben.
#2827832
Lesenswert?

Hallo Ingo,

ich konstruiere mir über den "Befehlssatz" (meistens) einen 
deterministischen endlichen Automaten:

http://de.wikipedia.org/wiki/Deterministischer_endlicher_Automat

Den Empfangsbuffer verwende ich nur Zeichenweise, lese also ein Zeichen 
nach dem Anderen, und lasse damit den deterministischen endlichen 
Automaten ablaufen seinen Zustand ändern.

Beispiele:

Endliche Automaten
# 
http://www.informatik.uni-bremen.de/theorie/teach/lehre/thi1/WS1011/Folien/EA.pdf

Nicht-deterministische Endliche Automaten
# http://www.brawer.ch/prolog/endlicheAutomaten.pdf

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