String auf einen anderen String übertragen
-
Hallo,
ich plage mich seit einiger Zeit damit rum einen String zu zerlegen.
Und zwar programmiere ich einen Mikrocontroler mit Ansi C. Über die serielle Schnittstelle schicke ich einen Befehl in der Form von e340z.
Der erste Buchstabe (hier e) soll für einen bestimmten internen Befehl verwendet werden und die 340 stellt einen Stellwert dar. z ist das "Endezeichen".
Nun müssen diese beiden Sachen von einander getrennt werden, damit der Stellwerte und der "Befehlswert" jeweils verwendet werden kann.
Hier mal ein Codebeispiel:char inByte[5]; char buffer[4]; int i = 0; char zeichen; char fertig = 0; void setup() { Serial.begin(57600); } void loop() { if(Serial.available()){ zeichen = Serial.read(); if((zeichen != 'z') && (i < 10)) { fertig = 0; inByte[i] = zeichen; inByte[i+1] = '\0'; i++; } else fertig = 1; } if((fertig == 1) && (i > 0)) { if(inByte[0] == 'a'){ Serial.println("Befehl 1"); } if(inByte[0] == 'e'){ Serial.println("Befehl 2"); } for(int n = 0; n<5 ;n++){ buffer[n] = inByte[n+1]; buffer[n+1] = '\0'; } soll = atoi(buffer); i = 0; } }
Dies klappt aber nur beim aller ersten Durchlauf. Bei den nächsten wird als Wert für buffer eine 0 ausgegeben wird.
Wißt ihr woran es liegen kann?
-
Thomas*** schrieb:
for(int n = 0; n<5 ;n++){
ist kein ANSI C.
Globale Variablen sind schlecht.
inByte ist zu klein dimensioniert, da du <10 abfragst.
Die buffer-Verschieberei ist überflüssig, du kannst direkt atoi(buffer+1) bzw. besser wegen Fehlerbehandlungsmöglichkeiten strtol verwenden.
Was sagt denn der Debugger?
-
Wutz schrieb:
Thomas*** schrieb:
for(int n = 0; n<5 ;n++){
ist kein ANSI C.
doch in c99 schon oder
-
Hm.. naja wenn das beim 1. mal klappt wäre vielleicht ein größerer
codeausschnitt interessant..Ach ja, probier statt deinem loop da mal:
int i; for((i = 0; inByte[i] != 'z') && (i < 10); i++) { inByte[i] = Serial.read(); } inBytle[i] = 0x00;
Hoffe mal da sind nicht allzuviele fehler drin so früh morgens..^^
-
Ach ja.. ka ob das der Fehler ist aber..
da i ja anscheinend global ist existiert i auch
weiter und behält seinen wert..Wurde beispielsweise ein befehl mit 6 zeichen eingelesen
bleibt i = 6.
-
cooky schrieb:
Hm.. naja wenn das beim 1. mal klappt wäre vielleicht ein größerer
codeausschnitt interessant..Ach ja, probier statt deinem loop da mal:
int i; for((i = 0; inByte[i] != 'z') && (i < 10); i++) { inByte[i] = Serial.read(); } inBytle[i] = 0x00;
Hoffe mal da sind nicht allzuviele fehler drin so früh morgens..^^
z.3 "i = 0;(" statt "(i = 0;"
-
z.8 inByte statt inBytle
-
lol, naja war ja klar aber wozu gibts denn compiler die meckern können