Serial_Read macht mich fertig

Hi, der Anfänger ist wieder mal verzweifelt...
Habe einfache Aufgabe bekommen:
Beim eingeben einer "1" in den Serial-Monitor soll LED an Pin 13 angehen und als Text ausgeben: "Led on"
Sende ich eine "2" anden Arduino ,so soll er die Led auf "LOW" setzen und "Led off " ausgeben.
Soweit funktioniert das auch, aber wenn ich irgendeine Zahl eingebe, so soll er schreiben "Ungültige Eingabe!"

Sobald ich die dritte "else if "-Bedingung ins spiel bringe kommt die fehlermeldung: "command was not declared in this scope" ...was ja nicht stimmt.....
keine Ahnung , aber dieses "else if" konnt mir der Lehrer nicht erklären....was tut es genau und warum kann ich nicht : else if( command != '1' && commmand != '2') schreiben ?????
Bitte um Hilfe !

int led = 13;

void setup() {
 pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
  if (Serial.available() >0)  {
    int command = Serial.read();
   if (command == '1') {
    digitalWrite(led, HIGH);
    Serial.println("LED on");
    Serial.println("Zum Auschalten geben Sie bitte die 2 ein");
    
   }else if (command == '2'){
    digitalWrite(led, LOW);
    Serial.println("LED off");
    Serial.println("Zum Einschalten geben Sie bitte die 1 ein");    
   }
   else if( command != '1' && commmand != '2')  {
    Serial.println("Unbekannter Befehl! ");
      }    
     }
   }

commmand und command sind zwei verschiedene Namen :wink:

einer von beiden ist 'not declared in this scope'

Vielen Dank ! Jetzt hab ich keine Fehlermeldung mehr , aber wie bring ich ihm bei , das er Bei einer 1 oder 2 NICHT auch noch "Ungültiger Befehl" ausgibt ? Bei einer anderen Zahl passts...

LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl! 
Unbekannter Befehl!

Sendest du ein Zeilenende mit? ( oder ein Leerzeichen oder sonstwas ?)
Lass dir doch das unerwartete Zeichen anzeigen.
Da es als int deklariert ist, gäbe Serial.print(command,HEX); dir gleich den Hex-Code aus
( Ich tippe auf D (0x0d= CR) oder A (0x0a= LF) )

Vielleicht denkst du nochmal über die Bedingung für den ungültigen Befehl nach.
1 ist ja schließlich auch !=2 und somit dann auch ungültig.

na ja, dafür ist ja daselsedrin.
Bei der dritten Bedingung (dem zweiten else) könnte er sich das if sparen.

if ( c == '1' ) {}
else if ( c == '2') {}
else { /* c ist weder '1' noch '2' */ }

Habe keine Ahnung WIE ich ein Zeilenende mitschicke und warum?
Mit HEX-Zahlen fang ich als Anfänger auch nicht viel an..

... das 1 auch !=2 ist - das versteh ich, aber wenn ich eingebe " else if( command != '1', != '2') "
das schmeckt ihm auch nicht , wie soll ich ihm erklären , das NUR 1oder2 gilt und bei jeder anderen Zahl die Meldung "Ungüötiger Befehl " ausgeben soll..????

Hab das jetzt so wie Michael geschrieben hat (falls ichs richtig verstanden habe) gemacht aber es kommt aufs gleiche raus.....bei jeder falschen Eingabe kommt 2mal "Unbekannter Befehl!"

void loop() {
  if (Serial.available() >0)  {
    int c = Serial.read();
   if (c == '1') {
    digitalWrite(led, HIGH);
    Serial.println("LED on");
    Serial.println("Zum Auschalten geben Sie bitte die 2 ein");
    
   }else if (c == '2'){
    digitalWrite(led, LOW);
    Serial.println("LED off");
    Serial.println("Zum Einschalten geben Sie bitte die 1 ein");    
   }
   else {
    Serial.println("Unbekannter Befehl! ");
      }    
     }
   }

Habe keine Ahnung WIE ich ein Zeilenende mitschicke und warum?

Wegen dem "ln" in "println" macht einen Zeilenumbruch.

Und dein Serieller Monitor sendet auch evtl. nl+cr
Das kannst du abstellen.

const byte led = 13;

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

void loop()
{
  switch(Serial.read())  
  {
    case -1  : 
    case '\n':
    case '\r': break;
    
    case '1' :
      digitalWrite(led, HIGH);
      Serial.println("LED on");
      Serial.println("Zum Auschalten geben Sie bitte die 2 ein");
      break;
    
    case '2' :
      digitalWrite(led, LOW);
      Serial.println("LED off");
      Serial.println("Zum Einschalten geben Sie bitte die 1 ein");    
      break;
   
    default:
      Serial.println("Unbekannter Befehl! ");
  }    
}

Gibt es eine Notwendigkeit Serial.available() zu nutzen?
Nein!

Das mit dem switch ist sehr interessant, aber nicht das was mein lehrer haben will...
Ich seh nurmehr : "Unbekannter Befehl! " der Serial Monitor soll NUR dann text ausgeben(LED on - LED off), wenn eine 1 , 2 (oder bei anderer Zahl :"Unbekannter Befehl! ") gesendet wird....
Das was ich nicht brauche , ist das er mir bei jeder "richtigen" eingabe (1oder2) auch " Ungültige Eingabe" ausgibt...

Was ist nl+cr ???

LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl! 
LED on
Zum Auschalten geben Sie bitte die 2 ein
Unbekannter Befehl! 
LED off
Zum Einschalten geben Sie bitte die 1 ein
Unbekannter Befehl!

Hi

Du sendest aber selber '1' zum Arduino.
Dieser macht genau Das, was Du Ihm gesagt hast:

  • oha, eine 1 ... LED AN
  • da kommt noch was ... keine 1, keine 2, ... 'unbekannt'

Wenn Du wirklich ein unbekanntes Zeichen schickst, wirst Du ZWEI oder DREI 'Unbekannter Befehl!' bekommen - wegen dem eigentlichen unbekanntem Befehl (von mir aus einer 3) und jeweils eine Meldung zu den Steuerzeichen CR und LF, Die Dein Terminal mit schickt.

Wenn Du die Ausgabe 'Unbekannter Befehl!' mit dem ASCII-Code des ungültigen Zeichen erweiterst, siehst Du Es recht schnell, was Da ab geht.

Nicht, daß Dir Das schon vorgeschlagen wurde :wink:

MfG

..und wie mach ich das mit dem "Erweitern um ASCII-Code des ungültigen Zeichen " ???
in der ASCII - Tabelle finde ich unter "032" ein Leerzeichen, aber wo soll ich den hinschreiben???
Hab den tip mit "Serial.println(c,HEX);" auch befolgt, kann aber damit nichts anfangen...
..hab erst paar mal Unterricht in C++ gehabt und deshalb keine Ahnung wie ich das machen soll :astonished:

Hi

Aus

Serial.println("Unbekannter Befehl! ");

wird

Serial.print("Unbekannter Befehl! (0x");
if (c<16){
   Serial.print("0");
}
Serial.print(c,HEX);
Serial.println(")");

Wenn Du mir jetzt sagen kannst, was Du bei diesem Code als Ausgabe erwartest, Du also den Code verstanden hast, bist Du schon einen großen Schritt weiter.

Ich erwarte bei einer 3 (0x33).
Dazu wirst Du noch 0x0D und/oder 0x0A bekommen (was CR und LF entspricht) - Diese wirst Du in den Innereien Deines Terminal-Programm mit hoher Wahrscheinlichkeit abstellen können.

MfG

Schick ihm doch mal vom seriellen Monitor 12221212 oder so, und guck dir an, wann/wo dein unbekanntes Zeichen kommt.

SerialMonitor.jpg

Mit einem Klick gelöst ! Vielen Dank Michael !

... und wieder ein Mal konnte ein Problem durch C&P (in diesem Fall Klicken nach Bildvorlage) behoben werden - Eigeninitiative erfolgreich abgewehrt ...

@postmaster:
Wenn es ein Dutzend Posts braucht, bis die Antwort aus #3 ankommt... , war das wohl so erforderlich :wink:

Meiner Glaskugel war das Problem sofort klar, aber sie hat mir leider nicht gleich zur
"Bilder zeigen für Dummies" - Lösung geraten

Es stellt sich immer wieder die alte Weisheit als wahr heraus: Ein Bild sagt mehr als tausend Worte.

Anscheinend hatte der Thread noch keine (mehr als) 1000 Worte bis dahin. :slight_smile:

@michael_x:
Super Idee, das Bild!