Serialmonitor gibt mir immer eine 0 nach meiner Whileschleife wieder

Hallo, ich bin neu im Programmieren mit Arduino und stehe vor einem Problem.
Ich möchte, dass mich der Serielle Monitor nach beenden der while-Schleife wieder auf meine Eingabe wartet.
Stattdessen zählt das Programm die Wiederholungen korrekt, gibt mir aber danach nochmal eine Rückmeldung, dass meine Eingabe (welche ich nicht getätigt habe) 0 ist.

Anbei mein simpler Code und ein Screenshot des Monitors.

String Text1 = "Bitte wähle die Anzahl der Wiederholungen: ";
int myNum;
int i;
int dT = 750;

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

void loop() {
  Serial.print(Text1);
  while (Serial.available() == 0) {
  }
  myNum = Serial.parseInt();
  Serial.println(myNum);
  i=1;
  while (i<=myNum) {
    Serial.println("AN");
    delay(dT);
    Serial.println("AUS");
    delay(dT);
    i=i+1;
  }
}

Stell die Lineendings im Serial Monitor auf "kein Zeilenende",
du bekommst CR und LF angehängt, die dein Programm verwirren,
weil es nicht damit rechnet.

1 Like

Als Alternative kannst Du auch kontrollieren ob die Empfangenen Zeichen CR und LF sind und diese verwerfen. Du kannst auch nur Zahlen entgegennehmen und alles andere verwerfen.
Grüße Uwe

  while (Serial.available() == 0) {
  }

Das ist überflüssig. loop() ist schon eine Schleife. Schleifen dieser Art können daher durch if-Abfragen ersetzt werden.
Dann kann man während der Zeit auch noch andere Dinge tun.

Ich würde gerne noch eine Alternative zur Lösung vorschlagen, die ohne Umstellung im seriellen Monitor auskommt (falls das Werk mal an einem Terminalprogramm betrieben werden soll oder man nicht immer hin- und herschalten will):

Nach dem parseInt die serielle Schnittstelle "leer-lesen".

  myNum = Serial.parseInt();
  while (Serial.available() > 0) {
    Serial.read();
  }
  Serial.println(myNum);

Gruß Walter

Das liest nur leider nicht die Schnittstelle leer, weil wenn Serial.available() viel schneller ist, als Zeichen reinkommen.

Da hast Du wohl recht, das stimmt leider zu oft.

Evtl. hilft eine Wartezeit in der while()-Schleife von 1/10 der Bitrate (wobei Warten immer doof ist). Muss ich bei Gelegenheit mal ausprobieren.

Vermutlich ist die Stelle, an der ich das hingepackt habe, auch blöd - direkt vor der Ausgabe der Eingabeaufforderung wäre wohl besser. Dann können die restlichen Zeichen während der Verarbeitung noch in den Schnittstellenpuffer laufen.

Ist ein ähnliches Problem nicht auch für den Timeout vorhanden, der dem parseInt() innewohnt? Wenn die Zeichen zu langsam eintröpfeln, kommt es dann zu unvollständigen Zahlen.

Naja, die Grundeinstellung ist 1000 ms - das sollte reichen :wink:

Timeout passiert nur, wenn das letzte Zeichen eine Ziffer ist. Sobald klar ist, dass die Zahl komplett ist (Leerzeichen, Neue Zeile, anderer Text), kommt parseInt sofort zurück.
Wenn das folgende Zeilenende also nur '\n' ( und nicht "\r\n" ) ist, funktioniert dein Vorschlag immerhin, @wno158.

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