<solved> RF String zerlegen, brauche Hilfe

Hallo allerseits,
ich experimentiere gerade mit einem 433MHz RF Modul und einem DHT11.
Ich empfange die Temperatur und die Luftfeuchtigkeit usw. also senden und empfangen klappt.

ABER ich habe das gefühl man kann den STRING bestimmt einfacher zerlegen als ich das gemacht hab.

Hier der gesendete String:

  int humiINT = (int)humi;
  int tempINT = (int)temp;
  int vccINT  = (int)readVcc();

  snprintf(msg, 26, "s=%d&t=%d&h=%d&v=%d", SENSORID,tempINT,humiINT,vccINT) ;

  vw_send((uint8_t *)msg, strlen(msg));  // Daten per VirtualWire-Lib versenden
  vw_wait_tx();  // Auf kompletten Versandt warten

Und hier von der empfänger Seite:

void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  // Daten-Variable, die die empfangenen Daten hält
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];

  // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
  String SensorData;
  String Sensor1;

  // Empfang von Daten prüfen
  if (vw_get_message(buf, &buflen)) {
    int i;
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit 0en füllen

    
    // Datagramm zusammensetzen
    for (i = 0; i < buflen; i++) {
      SensorDataTemp[i] = (char)buf[i];
    }
    
    // Char-Variable terminieren
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';

    // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 
    SensorData = SensorDataTemp;
    
    // Serial-Output zum Debuggen
    Serial.println();
    Serial.print(F("Daten empfangen: "));
    Serial.print(SensorData);
    Serial.println();
  }
 }

Und so sieht das aus, was da an kommt:

Daten empfangen: s=1&t=25&h=40&v=4537

s=1 <–SensorID
t=25 <–Temperatur
h=40 <–Luftfeuchte
v=4537 <–Volt

Und zerlegt habe ich das so:

    Serial.print(F("Temperatur: "));
    Serial.print(SensorData[6]);
    Serial.print(SensorData[7]);
    Serial.print(F("C "));
    Serial.println();

    Serial.print(F("Luftfeuchte: "));
    Serial.print(SensorData[11]);
    Serial.print(SensorData[12]);
    Serial.print(F("%"));
    Serial.println();

Ich hoffe ihr versteht mich :blush:
Ich möchte aus dem String also nur die Temperatur und die Luftfeuchte haben.

Was du mit snprintf() gemacht hast, gibt es auch zum Einlesen mit sscanf(): http://www.cplusplus.com/reference/cstdio/sscanf/

Du musst bei beiden Funktionen nur beachten, dass diese auf dem Arduino nicht mit Float funktionieren. Aber mit Integern geht es.

char str[] = "s=1&t=25&h=40&v=4537";
int temperature;
int humidity;

sscanf(str, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity);

EDIT: Das musst du aber auf einen C-String/char Array anwenden! Mit den String Objekten geht das nicht. Du kannst aber wahrscheinlich einfach SensorDataTemp dazu nehmen.

Hallo,
vielen Dank für deine Hilfe.
Also ich habe deinen Code einfach mal eingefügt und versucht zu verstehen…
Er funktioniert, ich bekomme die Temperatur und die Luftfeuchte angezeigt.

Aber verstehen tu ich es leider nicht.

char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];

int temperature;
int humidity;

sscanf(str, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity);

Woher weiß er das &temperature die Temperatur und &humidity die Luftfeuchte ist?

Und wenn ich nun die Voltzahl auch sehen möchte klappt das nicht ? Warum ?

    char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];
    int temperature;
    int humidity;
    int readVcc;

    sscanf(SensorDataTemp, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity, &readVcc);
    
    Serial.println(temperature);
    Serial.println(humidity);
    Serial.println(readVcc);

Ok, ich habe einfach den * entfernt. Jetzt klappt es... Aber ob es das verstanden habe... Ich hoffe...

Der Stern bedeutet, dass die Zahl überlesen wird. Ich hatte einfach alle Zahlen mit %d markiert und an die zwei nicht benötigten einen Stern gemacht, damit man keinen Parameter dafür übergeben muss.

Siehe hier: http://www.cplusplus.com/reference/cstdio/scanf/ (für die vollständige Liste aller Optionen) http://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe

Der Stern ist im ersten Link erklärt: "An optional starting asterisk indicates that the data is to be read from the stream but ignored (i.e. it is not stored in the location pointed by an argument)."

Super !! Dann habe ich das ja doch richtig verstanden. Also vielen Dank für deine schenlle HIlfe und deine Eerklärung.

DANKE !!

Jetzt funzt erstmal alles so wie es soll... :D