Forum: Mikrocontroller und Digitale Elektronik USART Empfangsbuffer


von Ingo (Gast)


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

von Falk B. (falk)


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.

von Uwe S. (de0508)


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

von Ingo (Gast)


Lesenswert?

Ich habe sehrwohl Zugriff auf jedes einzelne Zeichen. Wie sähe denn 
deine Ausleseroutine aus, wenn nicht Stringcompare? Irgendwie muss ja 
der Vergleich erfolgen.

Ingo

von Uwe S. (de0508)


Lesenswert?

Hallo Ingo,

lies mal bitte dieses PDF 
(http://www.brawer.ch/prolog/endlicheAutomaten.pdf), da sollten Dir 
gleich einige Idee kommen.

Welche Befehle (Strings) gibt es bei Dir ?
Das ist wichtig um damit einen DEA zu konstruieren.

Einige schreiben auch State-Machine, aber es steckt eine DEA dahinter !

von Ingo (Gast)


Lesenswert?

Ich werde mit mal in Ruhe ansehen

von Falk B. (falk)


Lesenswert?


von Uwe S. (de0508)


Lesenswert?

Danke Falk,

damit sollte er weiter kommen.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier mal ein einfaches Beispiel eines Kommandointerpreters. Damit sollte 
das Prinzip klar werden. Solange Zeichen vom UART/FIFO lesen, bis  man 
ein Kommandoendezeichen erkannt hat. Dann kann man den ausgelesenen 
String dekodieren.

von Ingo (Gast)


Lesenswert?

Und wie prüft man z.B. auf "Hallo"? Erst gucken ob ein 'H' vorhanden 
ist, wenn dann gucken ob ein 'a' danach kommt usw... ? Ah jetzt ja...!

von Thomas E. (thomase)


Lesenswert?

Ingo schrieb:
> Und wie prüft man z.B. auf "Hallo"? Erst gucken ob ein 'H' vorhanden
> ist, wenn dann gucken ob ein 'a' danach kommt usw... ? Ah jetzt ja...!
Kannst auch solange lesen, bis du "\0" bekommen hast und dann den ganzen 
String auswerten.

mfg.

von Uwe S. (de0508)


Lesenswert?

Hallo Thomas,

der FiFo liefert doch kein '\0' nur einen Status EndOfChar.

von Thomas E. (thomase)


Lesenswert?

Uwe S. schrieb:
> nur einen Status EndOfChar.
Und wie kommt er darauf, daß das Ende erreicht ist?

mfg.

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.