ich zerbreche mir grad über Folgendes den Kopf:
Mit dem Arduino würde ich gerne eine Serverantwort auslesen, welche folgendermaßen aussieht:
,112923450,20,21690,,642867104857625465000000,0
Die farbigen Bereiche sind die interessanten Teile. Die rote Zahl kann auch zweistellig werden, die grüne auch dreistellig. Die Nullen hinter den beiden ersten sind immer dabei und uninteressant. Die zwei Kommas vor dem letzten Block sind kein Tippfehler.
Für's Erste wäre es schonmal eine Hilfe, die Werte zwischen den Kommas in jew. eigene Strings zu schreiben.
Die Zahlenkolonne ist ein String, und auch die einzelnen Variablen sollten Strings bleiben.
Hat jemand eine Idee, wie ich das machen kann?
Eine einzelne Stelle des Strings kann man übrigens mit "Stringname.charAt(x)" ausgeben, das habe ich schon herausgefunden.
Es gibt für Dein Problem sicher verschiedene Lösungen.
Falls Du den ankommenden String zeichenweise einliest, kannst Du den ja schon beim Lesen zerlegen.
unsigned long data;
char buffer[40];
int index = 0;
int counter = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
//wenn serielle Daten vorhanden, dann einlesen
if(Serial.available()) {
//einzelnes Zeichen lesen
char c = Serial.read();
//wenn Trennzeichen, dann vorherige Daten verarbeiten
if(c==',' ) {
//bisher gelesenen String terminieren (letzte Byte = \0)
buffer[index] = 0;
//Zähler für die Anzahl der gelesenen Werte erhöhen
counter++;
//Puffer-Index wieder auf 0 setzen
index=0;
//String in Zahl umwandeln
data = atol(buffer);
//Ausgabe
Serial.print("Zahl ");
Serial.print(counter);
Serial.print(" = ");
Serial.println(data);
} else {
//kein Trennzeichen, dann Ziffer in den Puffer schreiben und Index erhöhen
buffer[index++] = c;
}
}
}
Das ist nur ein Beispiel und krankt auch an der Umwandlung der großen Zahl, die leider nicht in ein unsigned long passt. Aber das Prinzip wird denke ich klar.
while (1) {
if (Serial.available()) {
char c = Serial.read();
if (c == '\0' || c == '\r' || c == '\n') { // Wenn die Textzeile durch ist...
Serial.print(data[0]);
Serial.print(", ");
Serial.print(data[1]);
Serial.print(", ");
Serial.print(data[2]);
Serial.print(", ");
Serial.println(data[3]);
break; // Fertig, while() beenden!
} else if (c != ',') { // Normalfall
// Aktuelles Zeichen ans Ende des Puffers hinzufuegen und Pufferposition hochzaehlen
buffer[bufferPos++] = c;
} else { // Sonderfall: Das aktuelle Zeichen ist ein Komma
// Komma durch '\0' ersetzen, markiert fuer die strtoul()-Funktion das Ende der Zahl
buffer[bufferPos++] = '\0';
// Nur bei bestimmten Kommas reagieren!
if (commaCount==2 || commaCount==3) {
buffer[bufferPos-2] = '\0'; // bei beiden Zahlen die hintere '0' wegschneiden
// Teil des uebergebenen Textes in vorzeichenlose Zahl umwandeln
data[dataPos++] = strtoul(buffer, NULL, 10);
} else if (commaCount == 5) {
buffer[bufferPos-12] = '\0'; // 4. Zahl rausschneiden
data[dataPos+1] = strtoul(buffer+6, NULL, 10);
buffer[bufferPos-19] = '\0'; // 3. Zahl rausschneiden, REIHENFOLGE NICHT UMDREHEN!
data[dataPos] = strtoul(buffer, NULL, 10);
}
commaCount++;
bufferPos = 0; // Puffer zuruecksetzen
}
}
}