Kommagetrennte Werte zerlegen

Hallo,

Ich bin relativ neu in Sachen Arduino, LED bekomme ich soweit zum leuchten und blinken,

Jetzt nehme ich eine etwas größere Herausforderung an:

Ich bekomme Seriell einen Wert wie z.B 29.33,30.78,1003.52

dies will ich gerne aufteilen in z.B

Temp = 29.33
Feuchte = 33.30
Druck = 1003.52

und diese Werte will ich dann auch weiterverarbeiten, aber wie bekomme ich das hin ?
habe schon sehr vieles über atof, atoi, sscanf gelesen, bringe es aber einfach nicht hin,
kann mir jemand etwas unter die arme greifen ?

Du suchst strtok.

Vielen Dank für den Tip,

   char string = msg.c_str();
   char delimiter[] = ",";
   char *ptr;
   ptr = strtok(string, delimiter);
while(ptr != NULL) {
printf("Abschnitt gefunden: %s\n", ptr);  

  ptr = strtok(NULL, delimiter);
}

beklomme ich folgende fehlermeldung:

In function 'void receivedCallback(const uint32_t&, const String&)':
Temp_Sensor error: invalid conversion from 'const char*' to 'char' [-fpermissive]
    char string = msg.c_str();
                           ^
Temp_Sensor: error: invalid conversion from 'char' to 'char*' [-fpermissive]
    ptr = strtok(string, delimiter);

Bin mir dessen bewusst das es für den Anfang vielleicht etwas gewagt ist, aber es hilft mir ungemein viel mich mit den unterschiedlichen Werten zu beschäftigen

   char string = msg.c_str();

Totaler Unsinn. c_str() liefert einen const Zeiger auf das interne Array. Keinen char. Aber auch mit char* geht das nicht mit strtok(), weil strtok() die Zeichenkette selbst verändert (was mit ein const Zeiger natürlich nicht erlaubt)

Vergiss die String Klasse und verwende von Anfang an nur Null-terminierte char Arrays

Ohje, das ist etwas kompliziert :slight_smile: , aber ich Schlag mich durch

So kompliziert ist es nicht einen String vernünftig einzulesen:

Und dann einfach das:

... = atof(strtok(txt, ",;"));
... = atof(strtok(NULL, ",;"));
... = atof(strtok(NULL, ",;"));
... = atof(strtok(NULL, ",;"));

Es ist immer etwas schwierig, allgemeine Beispiele für C++ für den Arduino lauffähig zu bekommen. Das Beispiel mal auf Arduinisch:

void setup()
{
  Serial.begin(9600);
  Serial.println("Anfang");
  const byte ANZAHLELEMENTE = 3;
  float f[ANZAHLELEMENTE];
  char msg[] = {"29.33,30.78,1003.52"};
  char delimiter[] = ",";
  char *ptr;
  ptr = strtok(msg, delimiter);
  byte j = 0;
  while (ptr != NULL) {
    f[j++] = atof(ptr);
    Serial.print("Abschnitt gefunden: ");
    Serial.println(ptr);
    ptr = strtok(NULL, delimiter);
  }
  Serial.println(j);
  for (byte k = 0; k < ANZAHLELEMENTE; k++) {
    Serial.println(f[k], 2);
  }
}

void loop() {}

</sup> <sup>Anfang Abschnitt gefunden: 29.33 Abschnitt gefunden: 30.78 Abschnitt gefunden: 1003.52 3 29.33 30.78 1003.52</sup> <sup>

Vielen Dank für die vielen Tips bisher,

Ich habe das ganze jetzt etwas umgeschrieben, sodass ich keine kommagetrennte werte habe,
Ich bekomme jetzt die werte Zeilenweise geschickt, jeweils mit vorangestellter "Einheit"
T Temp
H Feuchte
P Druck

T-27.78
H-45.51
P-1001.75
T-27.78
H-45.51
P-1001.75
T-27.78
H-45.51
P-1001.75

immer so weiter, dies sollte das aufteilen etwas vereinfachen, denke ich, dafür habe ich:

einheit = msg.substring(0,msg.indexOf('-'));
    wert = msg.substring(msg.indexOf('-')+1);

dadurch hatte ich den "sauberen" wert ohne T- oder H-

so langsam komme ich der Materie näher :slight_smile:

Serenifly:
Vergiss die String Klasse und verwende von Anfang an nur Null-terminierte char Arrays

Nutze die Vereinfachung, dass die “Einheit” nur und immer genau ein Zeichen lang ist.