String nach Komma aufteilen

Hallo,

ich habe schon etliche Beispiele für das serielle Einlesen gefunden, aber das funktioniert bei mit nicht.

Ich habe ein String, der so aussieht: "13.54,0.27,1023,255,1,13:01:12"

Diesen möchte ich nun in einzelne Variablen teilen nur wie geht das??

timtailors:
Hallo,

ich habe schon etliche Beispiele für das serielle Einlesen gefunden, aber das funktioniert bei mit nicht.

Ich habe ein String, der so aussieht: "13.54,0.27,1023,255,1,13:01:12"

Diesen möchte ich nun in einzelne Variablen teilen nur wie geht das??

Das machst du mit "strtok". strtok

Geht mit C Strings sehr trivial. Aber nicht mit der Arduino String Klasse

Hallo,

also bei dem strtok-Beispiel erhalte ich diese Fehlermeldung:
initializer fails to determine size of 'string'

timtailors:
Hallo,

also bei dem strtok-Beispiel erhalte ich diese Fehlermeldung:
initializer fails to determine size of 'string'

Dann zeig mal den Sketch

Also das ist der entsprechende Abschnitt

      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        USE_SERIAL.println(payload);


        char string[] = payload;
        char delimiter[] = ",;";
        char *ptr;

        // initialisieren und ersten Abschnitt erstellen
        ptr = strtok(string, delimiter);

        while (ptr != NULL) {
          printf("Abschnitt gefunden: %s\n", ptr);
          // naechsten Abschnitt erstellen
          ptr = strtok(NULL, delimiter);
        }

bei dieser Stelle beschwert er sich: char string[] = payload;

bei dieser Stelle beschwert er sich: char string[] = payload;

zurecht.

Aber selbst wenn du den Fehler

initializer fails to determine size of 'string'

beheben würdest, z.B.

char string[80];

Ist danach das = Unsinn, denn du willst vermutlich deinen Puffer namensstringmit einem Text füllen.

Hallo,

kleiner Hinweis am Rande. Such mal nach RTC setzen oder lesen von jurs.
Darin ist eine Funktion zum zerlegen der Datums und Zeiteingabe wenn man die RTC stellen möchte.

quick & dirty

string_vor_dem_komma = inputstring.substring(0,inputstring.indexOf(','));
string_nach_dem_komma = inputstring.substring(inputstring.indexOf(',')+1);

wenn mehrere Kommata im String sind einfach weiter machen

string_nach_dem_komma = string_nach_dem_komma.substring(0,string_nach_dem_komma.indexOf(','));

kann man auch eine funktion raus bauen mit einer schleife

while string_nach_dem_komma != null
....

timtailors:
Hallo,

ich habe schon etliche Beispiele für das serielle Einlesen gefunden, aber das funktioniert bei mit nicht.

Ich habe ein String, der so aussieht: "13.54,0.27,1023,255,1,13:01:12"

Diesen möchte ich nun in einzelne Variablen teilen nur wie geht das??

Ich habe Dir mal ein Beispielprogramm gemacht, das die 10 integer-Werte aus Deinem "String" in ein Array einliest und auf Serial ausgibt. Die dafür von mir verwendete sscanf() Funktion ist zwar eigentlich nur für nullterminierte C-Strings (char-arrays) vorgesehen, aber für "String" gibt es ja seit einer Weile .c_str(), denn intern können offenbar nicht mal die Erfinder von "String" auf den Umgang mit nullterminierten C-Strings verzichten, sie verstecken das nur ganz gut, so dass man nur über den Umweg .c_str() an das eigentliche nullterminierte char-array herankommt, das der "String" intern verwaltet.

Beispielprogramm:

void setup() {
  Serial.begin(9600);
  String der_so_aussieht= "13.54,0.27,1023,255,1,13:01:12";
  // Diesen möchte ich nun in einzelne Variablen teilen nur wie geht das??
 int einzelneVariablen[10];
 sscanf(der_so_aussieht.c_str(), "%d.%d,%d.%d,%d,%d,%d,%02d:%02d:%02d", &einzelneVariablen[0],&einzelneVariablen[1],&einzelneVariablen[2],&einzelneVariablen[3],&einzelneVariablen[4],&einzelneVariablen[5],&einzelneVariablen[6],&einzelneVariablen[7],&einzelneVariablen[8],&einzelneVariablen[9]);
 Serial.println("Einzelne Variablen");
 for (int i=0;i<10;i++)
  Serial.println(einzelneVariablen[i]);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Hallo der_chipo und jurs,

als ich habe offenbar eine wichtige Info vergessen und zwar benutze ich einen ESP8266. Jurs sketch wird für einen nano zwar kompiliert, aber für den ESP scheint das nicht zu funktionieren.

@der_chipo

bei deinem beispiel funktionieren auch wieder die ersten zwei Werte. Der dritte wird nicht angezeigt.

      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        USE_SERIAL.println(payload);

float volt;
float strom;
int regen;
float temp;
volt = payload.substring(0,payload.indexOf(',')).toFloat();
strom = payload.substring(payload.indexOf(',')+1).toFloat();
regen=strom.substring(0,strom.indexOf(','));

        display.display();
        // Clear the buffer.
        display.clearDisplay();
        // text display tests
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.println(volt);
        display.println(strom);
        display.println(regen);
        display.println(temp);

der dritte wird nicht angezeitgt weil da kein komma mehr kommt. da kann der also nichts mehr finden .

volt = payload.substring(0,payload.indexOf(',')).toFloat();

rest = payload.substring(payload.indexOf(',')+1);

strom = rest .substring(0, rest .indexOf(',')).toFloat();

rest = rest.substring(rest.indexOf(',')+1);

regen=rest.toFloat();

Ein Super Beispiel dafür dass die String Klasse für sowas ein Alptraum ist

sowas ein Alptraum ist

Vermutlich gibt schon was besseres als  http.getString();  :wink:

Hallo,

ich vermute mal, du bist noch am suchen. :wink:

Ich habe diese mal getestet, hier wird der komplette String an "buf" übergeben und anschließend aufgeteilt.
In dieser Anordnung funktioniert es mit "strtok". Ich bin sicher, du wirst es für dich anpassen können.

Sicher gibt es noch einfachere Lösungen, aber diese verwende ich in abgewandelter Form auch bei mir.

char StartString[40];

char buf[] = "13.54,0.27,1023,255,1,13:01:12";

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 31; i++) {
    StartString[i] = char(buf[i]);
  }

  char* Part0 = strtok(StartString, ",");
  char* Part1 = strtok(NULL, ",");
  int Part2 = atoi(strtok(NULL, ","));
  int Part3 = atoi(strtok(NULL, ","));
  int Part4 = atoi(strtok(NULL, ","));
  char* Part5 = strtok(NULL, ",");

  Serial.println(Part0);
  Serial.println(Part1);
  Serial.println(Part2);
  Serial.println(Part3);
  Serial.println(Part4);
  Serial.println(Part5);
  delay(1000);
}