parse string

Hi, ich versuche das Beispiel von"Serial Input Basics nachzuvollziehen scheitere aber klaeglich and dem Beispiel 5.

Ich habe einen seriellen Datenstom der so aussieht:

"SP 0.0kW(:SUb 13.5V(:SSCt 27C(:SSMo 24C(:SP 0.0kW(:SP 0.0kW(:SP 0.0kW(...."

Der String beginnt mit dem Character S und endet mit ":"

Ich moechte nun eine Floatingvariable P beschreiben, eine Floating variable Ub, eine Integervariable SMO und eine integer Variable SCt.

Wie kann ich den Datenstring den ich zwischen S und : isoliere, nun zerlegen:

Ich verstehe diese strtokIndx Befehle einfach nicht. Kann mir da jemand helfen?

Vielen Dank schon mal

Heiner

Schau mal in diesem Thema in der Funktion ausgabe(), ob Dich das inspiriert.

strtrok() braucht man da nicht unbedingt. Jeder Wert had einen Identifikations-String davor. Daher ist es sehr viel einfacher mit strstr() nach dem Teil-String zu suchen. strstr() liefert einen Zeiger auf den Anfang des Teil-Strings, also muss man nur dessen Länge addieren um auf das erste Zeichen danach zu kommen

const char str[] = "SP  10.0kW(:SUb 13.5V(:SSCt  27C(:SSMo  24C(:";

float P, Ub;
int SMO, Sct;

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

  char* ptr = strstr(str, "P");
  if (ptr != NULL)
    P = atof(ptr + 1);

  ptr = strstr(str, "Ub");
  if (ptr != NULL)
    Ub = atof(ptr + 2);

  ptr = strstr(str, "SMo");
  if (ptr != NULL)
    SMO = atoi(ptr + 3);

  ptr = strstr(str, "SCt");
  if (ptr != NULL)
    Sct = atoi(ptr + 3);

  Serial.println(P);
  Serial.println(Ub);
  Serial.println(SMO);
  Serial.println(Sct);
}

void loop()
{
}

Wenn du aus unerfindlichen Gründen ein String Objekt hast, dann verwende c_str() für den Zugriff auf das interne char Array. Auch das ist hier ein Vorteil gegenüber strtrok(). strtok() ginge da nicht weil es den String verändert