If Anweisung mit Befehlseingabe über seriellem Monitor

Hallo, ich bin absolouter Neuling bei Arduino und ich scheitere momentan an folgendem Code.
Es soll über den seriellen Monitor mein Befehl "ein" bzw "aus" eingelesen werden und dementsprechend soll die Led reagieren.
Jedoch tut sich nichts und ich finden einfach den Fehler nicht.
Würde mich freuen, wenn mir jemand da helfen könnte.

String command;


void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if(Serial.available()){
    command = Serial.readString();
    if(command == "ein"){
      digitalWrite(LED_BUILTIN, HIGH);
    }
      else if (command == "aus"){
      digitalWrite(LED_BUILTIN, LOW);
    }
  }


}

Hallo,
das hängt damit zusammen das in command mehr drin steht als Du denkst. z.B das Enter ist auch drin.
Du könntest nur auf die ersten 3 Zeichen abfragen , oder mach es einfacher und gib nur ein Zeichen ein "e" oder "a" dann kannst Du nur ein Zeichen einlesen. Beispiele dazu findest Du in der IDE

reference

String command;


void setup()
{
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  if (Serial.available())
  {
    command = Serial.readString();
    if (!strncmp(command.c_str(), "ein", 3))
    {
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println(command);
    }
    else if (!strncmp(command.c_str(), "aus", 3))
    {
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println(command);
    }
  }
}

Der == Operator verwendet intern strcmp()
Da muss also keine Hand angelegt werden.

Offensichtlich doch.

Das seltsame ist, dass es bei einer anderen Person mit einer etwas älteren IDE version der von mir gepostete Code funktioniert.

Dazu wäre wichtig zu wissen, welche.
Da ich die 1.8.19 verwende, könnte man da vergleichen.

P.S.: Der Code da oben funktioniert. Und das sicher auch auf einer älteren und einer neuen Version.

Hallo dokash

Herzlich Willkommen im besten Arduino-Forum der Welt.

Probiere mal aus:

String command;
void setup() 
{
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() 
{
  if (Serial.available()) {
    command = Serial.readString();
    if (command == "ein\n") 
    {
      digitalWrite(LED_BUILTIN, HIGH);
    }
    else if (command == "aus\n") 
    {
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}
1 Like

Nein!
Falsche Kanone auf das tote Pferd.

Denn:
In dem String steht nicht das drin, was ihr darin erwartet.
Eine der Möglichkeiten, dem zu begegnen, wäre String::trim()

Die andere, bessere, wäre einen eigenen Parser bauen.
Stream::readString() ist eher nicht so gut geeignet, da es recht schlecht mit dem Bediener synchronisiert.

Naja, "ein" und "aus" leben ja noch.

Du weisst, dass ich ja sonst auch ein Verfechter dessen bin und das auch mal schnell in die Tasten klöppel, aber keiner kennt die Voraussetzungen, warum da String verarbeitet wird.

Ich muß ja niemandem etwas aufzwingen, was er nicht will, oder überhaupt danach gefragt hat.
Wird mir ja sonst immer vorgeworfen - nu mach ichs nicht, ist es auch nicht richtig.

Du darfst das gerne auf dich beziehen.
Wenn du daran Spaß hast.

String command;


void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if(Serial.available()){
    command = Serial.readString();
    command.trim(); // <--- so
    if(command == "ein"){
      digitalWrite(LED_BUILTIN, HIGH);
    }
      else if (command == "aus"){
      digitalWrite(LED_BUILTIN, LOW);
    }
  }


}

Wieso muß es "ein" und "aus" sein?
Ginge "e" und "a" auch.
Dann ist der Vergleich viel einfacher.

Grüße Uwe

Hallo Paul, ich danke dir sehr für die Abhilfe :+1:
Weißt du auch warum man eine neue Zeile einfügen muss damit der Befehl erkannt wird?

Die serielle Eingabe wird mit '\n' abgeschlossen.

1 Like

Mit \n
Mit \r
Mit \n\r

Je nach Datenquelle, bzw. Einstellung der Quelle.

Weil ein Zeichen mehr im String ist als du glaubst.
Darum ist auch trim() in diesem Fall genau die richtige Maßnahme.
trim() ist genau für solche Fälle erfunden worden.

2 Likes

Das Endezeichen macht das, was der Name sagt: es kennzeichnet das Ende der Eingabe.
Welches das wiederum ist, hängt halt vom Gerät/der Einstellung oder sonstwas ab.

Oder auch nicht, je nach Einstellung im SerialMonitor.
Die Enter-Taste ist dafür da, dass überhaupt was gesendet wird.
Welches Ende-Zeichen dann angehängt wird, ist dann Einstellungssache.

Das war auch die Erklärung, warum es woanders funktioniert hat.
"Alte Version" war falsch geraten.

Der Solution-Haken bei #8 sitzt also nicht für alle an der richtigen Stelle.

1 Like

Vollkommen korrekt. Dankeschön.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.