String trennen

Hallo,

ich habe folgenden Sketch etwas abgeändert im Netz gefunden.
SensorData sieht im Seriellen Monitor so aus: s=1,t=1580,h=4470,v=4980
Nun wollte ich den String trennen (immer beim Komma)
und am liebsten neue Variablen anlegen
s=1 zb. in Sensor
t=1580 zb. in Temperatur
h=4470 zb. in Luftfeuchte
v=4980 zb. in Spannung

Nun hab ich schon raus gefunden das ich den String auftrennen muss aber die frage ist nur wie.

Wäre euch echt sehr dankbar wenn mir jemand helfen könnte.

Gruß Dominik

#include <VirtualWire.h>
#include <SPI.h>

const int RECEIVERID  = 1; // ID des Empfängers
const int RX_Pin      = 8; // PIN, an den der 433 Mhz Empfänger angeschlossen ist
const int TX_Pin      = 9; // Einen leeren PIN angeben, da die VirtualWire-Lib sonst einen Pin belegt, der für den Ethernet-Chip genutzt wird
const int PTT_Pin     = 7; // Einen leeren PIN angeben, da die VirtualWire-Lib sonst einen Pin belegt, der für den Ethernet-Chip genutzt wird
   
 
 void setup() {
  Serial.begin(9600);
 
  // VirtualWire initialisieren
  vw_setup(2000);                      // Bits/Sec
  vw_set_rx_pin(RX_Pin);               // Empfangs-Pin für den 433-Empfänger setzen
  vw_rx_start();                       // Empfänger starten
 
  Serial.print("Auf Daten warten....");
  Serial.println();
}
 
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;
  
  // 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("Daten empfangen: ");
   
    Serial.println(SensorData);
   
    Serial.println();
 
    
 
    
  }
}

Zwei Optionen

1.) strtok() + atoi()

char str[] = "s=1,t=1580,h=4470,v=4980";
int s, t, h, v;

s = atoi(strtok(str, ",") + 2);
t = atoi(strtok(NULL, ",") + 2);
h = atoi(strtok(NULL, ",") + 2);
v = atoi(strtok(NULL, ",") + 2);

2.) sscanf()

char str[] = "s=1,t=1580,h=4470,v=4980";
int s, t, h, v;

sscanf_P(str, PSTR("s=%d,t=%d,h=%d,v=%d"), &s, &t, &h, &v);

Das str[] Array ist nur als Test drin. Du würdest da deinen Puffer übergeben

sscanf() ist einfach, aber hat einen hohen Speicher-Verbrauch und braucht länger. strtok() + atoi() ist dagegen sehr sparsam

Beide Optionen gehen nur wenn der String immer nur genauso aussieht. Wenn er variabel ist (also z.B. mal nur eine Variable übertragen wird), kann man das auch Parsen, aber das geht dann anders - mit strstr() + atoi()

Vielen dank für deine Antwort. Also die Werte sind immer anderst! Ich hab es jetzt mal so gelöst (aber ganz optimal ist das glaub ich nicht) Für verbesserungen bin ich sehr dankbar.

int sensor, luft, volt;
float temperatur; 

sensor=SensorData.substring(2).toInt();
temperatur=SensorData.substring(6, 10).toInt();
luft=SensorData.substring(13, 15).toInt();
volt=SensorData.substring(20, 26).toInt();

Wenn der String immer anders ist kann man es so machen. Und damit meine ich die Reihenfolge und die Anzahl der Parameter wie "s=". Nicht die Zahlenwerte!! Die Zahlen können natürlich anders sein.

char str1[] = "s=1,t=1580,h=4470,v=4980";
char str2[] = "t=1580,s=1,v=4980,h=4470";
char str3[] = "v=4980";
int s = 0; int h = 0; int v = 0;
float t = 0.0;

char* str = str1;

char* ptr = strstr(str, "s=");
if (ptr != NULL) s = atoi(ptr + 2);
ptr = strstr(str, "t=");
if (ptr != NULL) t = atof(ptr + 2);
ptr = strstr(str, "h=");
if (ptr != NULL) h = atoi(ptr + 2);
ptr = strstr(str, "v=");
if (ptr != NULL) v = atoi(ptr + 2);

atoi() = Array to Integer atof() = Array to Float

strstr() sucht nach dem Teil-String in str. Wenn der Teil-String nicht enthalten ist, gibt es NULL zurück. Wenn er drin ist, hat man einen Zeiger auf den Anfang des Teil-Strings. Dann macht man +2 um auf den Anfang der Zahl zu kommen und übergibt diesen Zeiger an die Konvertierungs-Funktion.

Das ist Test Code! Ich setzte da die Variablen vorher auf 0. Du würdest wahrscheinlich eher immer die aktuelle Version behalten wollen. Wenn der Wert nicht übertragen wird bleibt der alte erhalten.

Wenn du dann statt "char* str = str1" mal "char* str = str2" machst siehst du dass es sich immer noch alles ändert obwohl die Reihenfolge anders ist. Und bei "char* str = str3" wird nur v gesetzt.

okay dann hab ich es bei deinem ersten Post falsch verstanden :) Vielen dank du hast mir sehr geholfen!