String zerlegen

Hallo Community,
und wieder mal ne Frage von mir…
Also ich habe folgendes Programm:

#include <stdio.h>
#include <string.h>
String incoming ="";

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


void loop()
{
      if(Serial.available())
      {
        incoming="";
        while(Serial.available())
        {
          char value=Serial.read();
          incoming+=value;
        }
      }      
      Serial.println(incoming);
      char* token =  strtok(incoming, "+");
      char* loeffel = token;
      token= strtok(0, "+");
      char* knicker = token;
      token = strtok(0, "+");
      char* arm = token;
      token = strtok(0, "+");
      char* turm = token;
      token = strtok(0, "+");
      char* drive = token;
      Serial.println(loeffel);
      Serial.println(knicker);
      Serial.println(arm);
      Serial.println(turm);
      Serial.println(drive);    
      
    delay(1000);
    
}

Diese bekommt also über die Serielle Schnittstelle einen Wert der so aussieht:
12+12+12+12+12
nun will ich diesen String zerteilen und die einzelnen Werte zwischen den Plus zu bestimmten Int#s zu ordnen…
Nur muss ich dazu den String in einen char* umwandeln…

Kann mir hierzu jmd helfen?

lg flar2000

Lass die Strings weg und nimm char-Arrays. Zum Teilen dann strtok. Hier ist ein Beispiel drin.

Gruß Tommy

Nur muss ich dazu den String in einen char* umwandeln…

Es gibt keinen Grund die String Klasse überhaupt zu verwenden

Oft werden die Speicherprobleme angesprochen. Aber gerade wenn es um Splitten, Formatieren und Konvertieren geht hat man nur eine sehr eingeschränkte Funktionalität und einige Dinge gehen gar nicht und nur extrem umständlich

Und lerne den Zusammenhang zwischen Arrays und Zeigern!

  • als Trennzeichen ist übrigens nicht üblich. Ein Komma oder Strichpunkt tut es auch.

Sende am Ende ein Linefeed/Newline (kann man im seriellen Monitor einstellen). Dann geht das:

const int SERIAL_BUFFER_SIZE = 21;
char serialBuffer[SERIAL_BUFFER_SIZE];

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

void loop()
{
  if (readSerial(Serial))      //liefert true wenn das LF eingelesen wurde
    parseSerial();
}

void parseSerial()
{
  Serial.print("Empfangen: "); Serial.println(serialBuffer);

  int val1 = atoi(strtok(serialBuffer, ",;+"));
  int val2 = atoi(strtok(NULL, ",;+"));
  int val3 = atoi(strtok(NULL, ",;+"));
  int val4 = atoi(strtok(NULL, ",;+"));
  int val5 = atoi(strtok(NULL, ",;+"));

  Serial.println(val1);
  Serial.println(val2);
  Serial.println(val3);
  Serial.println(val4);
  Serial.println(val5);
  Serial.println();
}


bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n' && index > 0)       //wenn CR eingelesen und String länger als 0 ist
    {
      serialBuffer[index] = '\0';     //String terminieren
      index = 0;
      return true;                    //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      serialBuffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return false;        //noch nicht fertig
}

Das quasi gleiche Problem hatte der TO doch gerade hier in einem langen Thread. Warum muss da ein neues Thema dazu aufgemacht werden?

Gruß Tommy

Warum machst Du zur selben Frage Arrays von Computer an Arduino übergeben ein neues Thema auf?

Tommy war schneller :)