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
@ 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.
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
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
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 !
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.
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...!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.