Halli Hallo,
stehe gerade irgendwie auf dem Schlauch.
Ich möchte gerne ein Kommando aus einem String raus suchen.
Übergeben tue ich der Funktionen einen String und möchte mit einem
Zeiger Array voller Kommandos vergleichen. Ist ein Kommando mit einem
aus dem Zeiger Array identisch, soll das übernommen werden. Wenn nicht
soll weitergesucht werden bis alle Elemente untersucht wurden..
Bekomme es gerade nicht hin :(
Hallo Jan,
was genau funktioniert denn nicht? Hat es einen Grund, warum Du keine
Funktionen aus der string.h verwendest? Damit kannst Du Zeichen, Strings
und Teilstrings suchen.
Gruß
Florian
Peter D. schrieb:> Florian schrieb:>> Hat es einen Grund, warum Du keine>> Funktionen aus der string.h verwendest?>> Wie z.B. strtok, strcmp
Suchen diese Funktionen auch mitten im String?
Lass dir doch mal die Zwischenergebnisse von str ausgeben (mit printf
oder dem Debugger)
Bei printf kannst du die noch zwischen Trennzeichen setzen, damit du
Leerzeichen besser erkennen kannst.
1
printf("<%s>\n",str);
Nach der ersten while-Schleife zeigt str auf einen delimiter.
Aber damit fangen deine Kommandos sicher nicht an.
Must halt stat "set" einen pointer auf ein Element in deinem Array
setzen.
strstr liefert einen pointer auf den string zurück, was praktisch ist,
um damit weiterzuarbeiten.
Vorteil:
Portabel, weil Standarad-C-Funktion, simpel.
Nachteil:
Kein Sparwunder.
Mmhm schrieb:> Ich nehme gerne folgendes:> char *RX UART_RX_Buffer[0];>> if(strstr(RX, "set") != NULL){> //da seht set im RX: Kommando set ausführen> }
Normalerweise sind solche RX-Buffer ja als Ringbuffer ausgeführt. Wenn
ein Teil des Kommandos vor dem Wraparound steht und der Rest dann am
Anfang des Ringbuffers weitergeht, wird es nicht gefunden. Sieht mir
also nicht nach einer zuverlässigen Lösung aus.
Nop schrieb:> Mmhm schrieb:>> Ich nehme gerne folgendes:>>> char *RX UART_RX_Buffer[0];>>>> if(strstr(RX, "set") != NULL){>> //da seht set im RX: Kommando set ausführen>> }>> Normalerweise sind solche RX-Buffer ja als Ringbuffer ausgeführt. Wenn> ein Teil des Kommandos vor dem Wraparound steht und der Rest dann am> Anfang des Ringbuffers weitergeht, wird es nicht gefunden. Sieht mir> also nicht nach einer zuverlässigen Lösung aus.
Das kommt drauf an, wie man die UART umgesetzt hat, und in welcher
Umgebung.
Meine Lösung ist halt eben asynchron. Der Emfpang passiert in einer ISR,
die befüllt den Buffer, wenn das "Stopp-Zeichen" kommt oder der Buffer
überlaufen würde, wird ein Flag gesetzt. Überschüssige Zeichen werden
ignoriert, statt vorhanden Daten zu überschreiben.
Die Ausführung des Kommandos passiert komplett asynchron, wenn dem
Controller grad fad ist. Und das kann auch hunderte ms später sein.
Danach wird der Buffer gelöscht.
Ich behaupte auch nicht dass das allgemein sinnvoller ist als andere
Implementierungen oder ein Ringpuffer.
Aber das hier funktioniert auch dann zuverlässig, wenn der Controller
bei 99,99% Auslastung ist.
Nachteil ist halt die begrenzte Länge einer Message.
Aber sei es wie es sei:
Das Thema war weder um UARTs, noch um Ringpuffer, sondern das finden
eines Kommandos in einem String. Und das geht fallweise eben auch mit
strstr.
Okay. Das klappt soweit sehr gut. Wie untersuche ich jetzt den
"Kommando" String nach dem Ende? Habe mir gedacht das ich als
Kommandoende das '*' Zeichen nehme?!