Hallo,
ich steh mal wieder vor einem Problem, bei dem bisher jeder meiner
Lösungsversuche gescheitert ist,....
Über den UART empfange ich Daten, die ausgewertet werden müssen:
IMMER dieser Art
">:SET?2\r\n"
">:RESET?2\r\n"
">:TOGGLE?2?1000\r\n
In einer Routine lese ich diese Zeichen nun charweise in einen Buffer
ein, bis das \r
oder \n erkannt wird, danach möchte ich den string auswerten.
beispielsweise das hier
">:TOGGLE?2?1000\r\n
Soll nachher zu
str1 = ">:TOGGLE"
str2 = 2
str3 = 1000
konvertiert werden
Ihr seht, es gibt ein Kommando eingeleitet mit eiem ">:"
Danach folgen Eingaben, eingeleitet mit einem "?", jedem Fragezeichen
folgt eine neue Zahl, bis das \r\n kommt, was das Ende des kommandos
anzeigt.
Gibt es da Bibliotheksfunktionen, oder wie Trenne ich den String am
besten??
Danke und Gruß
Joe
Mein Problem,
ich möchte dieses Dynamisch gestalten, so dass nicht auf fest vier
Parameter geteilt wird, sondern bis zum Stringende.
bei strtok könnte man ja mit
while(token != NULL) arbeiten,
aber mit strtok_r geht das ja nicht???,....
Wie immer, fehlt mir die zündende Idee zur Vorgehensweise,....
Jemand einen Vorschlag,
Vielen Dank...
Gruß Joe
aber wie kann ich jetzt dieses Hier
actCommand.Par1
dynamisch speichern
am besten so:
1
charPar[5][20];//vermutlich syntaktisch falsch???
2
3
strcpy(actCommand.Par[i],token);
Nur das ist ein chararray, und dan bräucht ich nen zweifaches array,
außerdem weiß ich nicht so ganz, wie ich auf sowas zugreifen soll??
Rat?
Danke, Danke,....
Gruß
> am besten so:>> char Par[5][20]; //vermutlich syntaktisch falsch???>> strcpy( actCommand.Par[i], token );
Ja, am besten so. Und vermutlich syntaktisch richtig ;-)
In Par kannst du nun bis zu 5 Tokens speichern, von denen jedes bis zu
19 Zeichen (plus die Stringendenull) lang sein darf.
Wo ist das Problem?
> aber mit strtok_r geht das ja nicht???,....
Warum soll das mit strtok_r nicht gehen.
Beim kurzen Drüberschauen über die Doku von strtok_r
haben beide den gleichen Returnwert.
Edit: Hat sich ja mitlerweile erledigt.
µC-noob wrote
> if( i >= ( PARA_AMOUNT - 1) )> return 0; //not the most sensible solution but most effective!
Ein simples
if( i == PARA_AMOUNT )
return 0;
würde es auch tun :-)
Mit fällt auf, daß du in deiner Datenstruktur nirgends
vermerkt hast, wieviele Parameter denn nun extrahiert
werden konnten.
Das zweite: Du hast keine Sicherung eingebaut für den
Fall, dass die Parametergröße größer als PARA_SIZE wird.