Go Down

Topic: Mit Kommas getrennten String auslesen (Read 1 time) previous topic - next topic

HeyYeah

Hallo Leute,

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.

Vielen Dank schonmal, Gruß
Julian

mkl0815

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.

Code: [Select]


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.

Joghurt

So oder so ähnlich müsste es eigentlich...

Code: [Select]

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
}
}
}


Ungetestet, daher ohne Gewähr! ;)

Udo Klein

Schau Dir mal dieses Beispiel an: http://blog.blinkenlight.net/experiments/measurements/flexible-sweep/.

Das ist nicht 100% was Du vorhast, aber der stream parser sollte nahe genug dran sein. Ist auch dokumentiert und vor allem getestet ;)
Check out my experiments http://blog.blinkenlight.net

Go Up