Probleme mit der Eingabefunktion

Hallo zusammen,

ich habe ein Problem mit der Mehrfacheingabe von Werten im seriellen Monitor.
Wenn ich den folgenden Code in einem Sketch ganz alleine verwende, funktioniert dieser einwandfrei. Sobald ich diesen aber versuche in meinen bestehenden Code zu integrieren, ist das Ergebnis unbrauchbar und immer unterschiedlich.

Ich versuche mehrere Werte durch den seriellen Monitor einzulesen und somit weiter zu verarbeiten.

const unsigned int READ_BUFFER_SIZE = 21;    //Platz für 20 Zeichen + Terminator

void loop(){

  char* str = readLine(Serial); //liefert einen Zeiger ungleich 0 wenn das LF eingelesen wurde
  if (str != nullptr)
  {
    Serial.print("Eingelesen: ");
    Serial.println(str);

    int value1 = atoi(strtok(str, ","));
    int value2 = atoi(strtok(nullptr, ","));
    int value3 = atoi(strtok(nullptr, ","));

    Serial.println(value1);
    Serial.println(value2);
    Serial.println(value3);
  }
}

char* readLine(Stream& stream)
{
  static byte index;
  static char buffer[READ_BUFFER_SIZE];

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

    if (c == '\n') //wenn LF eingelesen
    {
      buffer[index] = '\0';     //String terminieren
      index = 0;
      return buffer; //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < READ_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      buffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return nullptr; //noch nicht fertig
}

Ergebnis:
Eingelesen: 10,10,10
10
10
10

Ergebnis, wenn in meinem vorhandenen Code:
Eingelesen: 1,0,10
1
0
10

Eingabe war jeweils 10,10,10.

Hat jemand eine alternative Idee, wie man das umsetzen kann?
Vielen Dank im Voraus!

Und jetzt soll man raten, was im "bestehenden Code" anders ist als im gezeigten funktionierenden Beispiel?

Eventuell rufst du an mehreren Stellen readLine auf?
Oder hast einen RAM Überlauf ?

void setup() {
  Serial.begin(115200);
}
void loop() {
  if (Serial.available() > 0)  {
    int value1 = Serial.parseInt();
    int value2 =  Serial.parseInt();
    int value3 =  Serial.parseInt();
    Serial.read();
    Serial.println(value1);
    Serial.println(value2);
    Serial.println(value3);
  }
}

Einlesen gem. Tutorial

Ja ist etwas mehr zum lesen/lernen. Aber es ist eine gut investierte Stunde.

Vielen Dank, dein Tutorial hat mir sehr geholfen!

1 Like