Gelöst: Arduino empfängt bei einem gesendeten immer 2 Zeichen über Serial

Gelöst:
Hallo,
Ich bin am verzweifen: Ich wollte nur, dass der Arduino auf einfache Eingaben im Seriellen Monitor reagiert, vergebens:

char data;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.print("Enter a Char: ");
  while(!Serial.available())
  {
    
  }
  data = Serial.read();
  if (data == 'O')
  {
    Serial.println("You entered 'O'");
  }
}

Lade ich diesen Sketch nun hoch und gebe ‘O’ ein, so erscheint die im Seriellen Monitor:

Enter a Char: You enterd ‘0’
Enter a Char: Enter a Char:

hier der Link zum Bild:
Bild vom Seriellen Monitor

Ich verstehe einfach die Welt nicht mehr :’(
Übrigens benutze ich einen ELEGOO MEGA2560 R3

Danke im voraus für die Antworten

if (data = 'O');

ist immer wahr, aber dennoch wirkungslos, wegen dem Semikolon Du möchtest einen Vergleich durchführen und keine Zuweisung, oder?

{ Serial.println("You entered 'O'"); }

Wird immer ausgeführt. Hier sind die Klammern wirkungslos, dank dem vorherigen Semikolon.

Aktiviere die Warnungen in der IDE:

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

Eine Zuweisung gibt den zugewiesenen Wert zurück. Gerade beim Einlesen von etwas kann man das ausnutzen, weshalb da kein Fehler kommt. Aber meistens ist es nicht gewünscht und man bekommt eine Warnung

  while(!Serial.available())
  {
  }

Das ist sinnlos. Du hast in loop() schon eine Schleife. Wenn nichts ankommt lässt man die halt durchlaufen

combie: ist immer wahr, aber dennoch wirkungslos, wegen dem Semikolon Du möchtest einen Vergleich durchführen und keine Zuweisung, oder? Wird immer ausgeführt. Hier sind die Klammern wirkungslos, dank dem vorherigen Semikolon.

Ok, hab das jetz oben angepasst, die Ausgabe ist aber immer noch unbrauchbar, siehe oben

Hallo,

hast du auch deine available Negation korrigiert?

char data;

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available())
  {
    data = Serial.read();
    
    if (data == 'O')
    {
      Serial.println("You entered 'O'");
    }
  }
}

Doc_Arduino: Hallo,

hast du auch deine available Negation korrigiert?

char data;

void setup() {  Serial.begin(9600); } void loop() {  if (Serial.available())  {    data = Serial.read();        if (data == 'O')    {      Serial.println("You entered 'O'");    }  } }

OK, ist alles gut, aber ich möchte das "Enter a Character"printen, warten bis man etwas eingibt und dann auf das eingegebene reagieren

Hallo

char data;

void setup()
{
  Serial.begin(9600);
  Serial.print("Enter a Char: ");
}
void loop()
{
  if (Serial.available())
  {
    data = Serial.read();
    
    if (data == 'O')
    {
      Serial.println("You entered 'O'");
      Serial.print("Enter a Char: ");
    }
  }
}

Ansonsten musste dir eine Logik einfallen lassen die diese Ausgabe steuert.

Doc_Arduino: Hallo

char data;

void setup() {   Serial.begin(9600);   Serial.print("Enter a Char: "); } void loop() {   if (Serial.available())   {     data = Serial.read();         if (data == 'O')     {       Serial.println("You entered 'O'");       Serial.print("Enter a Char: ");     }   } }




Ansonsten musste dir eine Logik einfallen lassen die diese Ausgabe steuert.

Ok, danke, muss das morgen versuchen. Das komische ist nur, dass das Problem auch bei beispielsketchen auftritt

Hi

Lasse Dir anzeigen, was für Zeichen empfangen wurden.
Wenn die Zeichen nicht druckbar sind (<33 / >127) als Zeichen-Wert (würde HEX empfehlen).
Dann wirst Du sehen, daß als 2.tes Zeichen immer ein 0x0A oder ein 0x0D kommt - und Das kommt von Deinem Terminal, in Dem Du genau Das angekreuzt hast, daß am Ende genau dieses Zeichen gesendet werden soll.
Kreuzchen raus: nur noch ein Zeichen.

MfG

postmaster-ino:
Hi

Lasse Dir anzeigen, was für Zeichen empfangen wurden.
Wenn die Zeichen nicht druckbar sind (<33 / >127) als Zeichen-Wert (würde HEX empfehlen).
Dann wirst Du sehen, daß als 2.tes Zeichen immer ein 0x0A oder ein 0x0D kommt - und Das kommt von Deinem Terminal, in Dem Du genau Das angekreuzt hast, daß am Ende genau dieses Zeichen gesendet werden soll.
Kreuzchen raus: nur noch ein Zeichen.

MfG

Ja, ich benutze den Seriellen Monitor der Arduino IDE, wo kann man da solche sachen einstellen?

wo kann man da solche sachen einstellen?

Unten findet sich ein Auswahlmenü

combie: Unten findet sich ein Auswahlmenü

Juhu, problem gelöst!!! Danke Das Problem war denkbar einfach: Aus irgendeinem Grund war im Seriellen Monitor links neben der Baudrate "Neue Zeile" anstatt "kein Zeilenende" eingestellt, hab keinen Plan warum, denn diesen Menüpunkt habe ich nie angerührt und wusste eigentlich auch nicht was er macht Danke nochmal an alle, die Lösungsvorschläge gebracht haben, ihr habt mir echt weitergeholfen

Normal sollte es vielleicht Aus sein, aber bei vielen Anwendungen ist das Newline sinnvoller. Bei einem Zeichen braucht man es nicht. Aber wenn man ganze Strings überträgt muss man damit das Zeilenende markieren