strtok(rcv,"0F")
Die Zeichenkette "0F" wird als zwei einzelne Zeichen interpretiert. Bei ",;"
, also trenne bei ','
oder ';'
macht das Sinn.
daniblpr2020:
... das Problem war für mich dann nur, dass ich nicht weiß wie ich als char[], meine "0F" zu "X" bekomme, da ich bei 0F in strtok() nurnoch Werte bis ...31313a3 bekomme und der Rest verschluckt wird.
Dafür kann man sich eine kleine Funktion basteln, die die Zeichen im Zweierrhythmus abfragt und mit zwei Zeigern (nicht C-Zeiger) durch die Elememte geht, weil sich die Zeichenkettenlänge ja reduziert:
void setup() {
Serial.begin(9600);
Serial.println("\nAnfang");
getData();
}
void ersetze(char * buf, const char ers) {
byte j = 0, k = 0;
while (buf[k] != '\0') {
if (buf[k] == '0' && buf[k + 1] == 'F') {
buf[j] = ers;
j = j + 1;
k = k + 2;
} else {
buf[j] = buf[k];
buf[j + 1] = buf[k + 1];
j = j + 2;
k = k + 2;
}
}
buf[j] = '\0';
}
void getData() {
char rcv[] = "310FCD0FCD0FCD0F4C0F31313a30100F31333a3030";
Serial.println(rcv);
ersetze(rcv, ';');
Serial.println(rcv);
char * pside = strtok(rcv, ";");
char * pname = strtok(NULL, ";");
char * pstate = strtok(NULL, ";");
char * proom = strtok(NULL, ";");
char * pday = strtok(NULL, ";");
char * ptbegin = strtok(NULL, ";");
char * ptend = strtok(NULL, ";");
Serial.println(pside);
Serial.println(pname);
Serial.println(pstate);
Serial.println(proom);
Serial.println(pday);
Serial.println(ptbegin);
Serial.println(ptend);
}
void loop() {}
Es geht auch mit anderen Zeigern:
void setup() {
Serial.begin(9600);
Serial.println("\nAnfang");
getData();
}
void ersetze(char * buf, const char ers) {
char * j = buf;
char * k = buf;
while (k[0] != '\0') {
if (k[0] == '0' && k[1] == 'F') {
j[0] = ers;
j = j + 1;
k = k + 2;
} else {
j[0] = k[0];
j[1] = k[1];
j = j + 2;
k = k + 2;
}
}
j[0] = '\0';
}
void getData() {
char rcv[] = "310FCD0FCD0FCD0F4C0F31313a30100F31333a3030";
Serial.println(rcv);
ersetze(rcv, ';');
Serial.println(rcv);
char * pside = strtok(rcv, ";");
char * pname = strtok(NULL, ";");
char * pstate = strtok(NULL, ";");
char * proom = strtok(NULL, ";");
char * pday = strtok(NULL, ";");
char * ptbegin = strtok(NULL, ";");
char * ptend = strtok(NULL, ";");
Serial.println(pside);
Serial.println(pname);
Serial.println(pstate);
Serial.println(proom);
Serial.println(pday);
Serial.println(ptbegin);
Serial.println(ptend);
}
void loop() {}
Inwieweit diese Vorverarbeitung sinnvoll ist, hängt vom Zusammenhang ab, denn man könnte auch gleich auf mehrere Variablen oder Feldelemente verteilen:
void setup() {
Serial.begin(9600);
Serial.println("\nAnfang");
getData();
}
char * zeiger(char * p) {
char * r = strstr(p, "0F");
r[0] = '\0';
r[1] = '\0';
r = r + 2;
return r;
}
void getData() {
char rcv[] = "310FCD0FCD0FCD0F4C0F31313a30100F31333a3030";
Serial.println(rcv);
char * pside = rcv;
char * pname = zeiger(pside);
char * pstate = zeiger(pname);
char * proom = zeiger(pstate);
char * pday = zeiger(proom);
char * ptbegin = zeiger(pday);
char * ptend = zeiger(ptbegin);
Serial.println(pside);
Serial.println(pname);
Serial.println(pstate);
Serial.println(proom);
Serial.println(pday);
Serial.println(ptbegin);
Serial.println(ptend);
}
void loop() {}
Lesestoff: strstr
In #2 habe ich gerade dies gefunden:
String data[6];
...
data[6] = ptend;
Das erzeugt einen Speicherkonflikt, der möglicherweise Dein Grundproblem ist. Mit
String data[7];
stürzt das Programm bei ein paar Versuchen auf einem UNO nicht ab.