Programmierung - Stopp für Eingabe über über seriellen Monitor

Hey,

Ich möchte über eine Eingabe im seriellen Monitor bestimmte Motoren auswählen und diese dann direkt mit einem Wert ansteuern. Mit der Ansteuerung der Motoren habe ich kein Problem. Es geht mir eher um die Eingabe im seriellen Monitor. Ich habe das Problem, dass ich das Programm nicht dazu bekomme solange zu stoppen bis ich eine Eingabe mache. Wäre cool wenn mir da wer helfen könnte.

Hier ist mal der Code mit dem ich es versucht habe umzusetzten:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Bitte geben sie Wert 1 ein: ");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available())
  {
    char data1 = Serial.read();
    Serial.println("Danke. Bitte den zweiten Wert eingeben: ");
    while(!Serial.available()) {}
    char data2 = Serial.read();
    Serial.print("Erster Wert: ");
    Serial.println(data1);
    Serial.print("Zweiter Wert: ");
    Serial.println(data2);
    
  }
}

Ich hab das so verstanden:
Wenn ein Wert eingegeben wird dann ist die If-Bedingung erfüllt und diese wird betreten. Der eingegebene Wert wird in data1 gespeichert. Danach kommt die while Schleife. In dieser müsste das Programm solange in sich selber zyklen bis die nächste Eingabe gemacht wird um diese dann anschließend in data2 zu speichern. Mein Problem ist aber, dass das programm das nicht macht... Gefühlt überspringt er die while Schliefe einfach und geht das Programm durch. Ich habe mal einen print in die while Schleife gesetzt um zu sehen ob es überhaupt irgendwie da rein geht. Und tatsächlich scheint es, dass er diese 5 mal wiederholt bis er dann wieder raus geht. Aber ich verstehe nicht warum er aus der while Schleife rausgeht obwohl ich keine eingabe tätige. Versteh ich vielleicht die Funktion Serial.available() falsch? Und habt ihr evtl. dann eine andere Möglichkeit das Programm anzuhalten für eine Eingabe? Wäre über Hilfe dankbar!!

Liebe Grüße
Sven

Hallo
das Tastatur sendet das Nutzzeichen, z.b. ein 'a', und dazu immer ein Steuerzeichen '\n' newline.

paulpaulson:
Hallo
das Tastatur sendet das Nutzzeichen, z.b. ein 'a', und dazu immer ein Steuerzeichen '\n' newline.

Das "Immer" ist falsch. Das kommt darauf an, was eingestellt ist.

Es wäre schlimm, wenn die Tastaur nach jedem Zeichen ein Newline senden würde, wie Du behauptest.

Gruß Tommy

Wäre über Hilfe dankbar!!

Erstmal musst du ein Protokoll erfinden, oder was übliches benutzen.
Dann einen passenden Parser programmieren oder einen vorhandenen verwenden.

Offensichtlich möchtest/kannst du beides nicht selber machen.

Also empfehle ich dir was fertiges, z.B. den CMDMessenger

Zunächst wäre mal die Frage, was für dich ein 'Wert' ist. Mit Serial.read() liest Du ein einziges Zeichen ein, das im Empfangspuffer steht. Wenn Du mit 'Wert' einen Zahlenwert meinst, musst Du erst alle eingetippten Ziffern einlesen, und die dann in einen Zahlenwert umwandeln. Dazu brauchst Du dann ein Endezeichen, dass dir sagt, wann alle Ziffern eingelesen sind. Das kann dann dieses bereits angesprochen '\n' ( 'New Line' ) sein, dass der Serielle Mpnitor bei entsprechender Einstellung am Ende einer Zeile anhängt.

Es ist auch keine gute Idee, das Programm anzuhalten, bis alle Zeichen eingegeben sind. Wenn dann mal nichts abgeschickt wirkt, steht das Programm bis zum Sankt Nimmerleinstag.

Hallo
ich mache dir mal einen praktischen Vorschlag, anstatt Bits zu spalten:
Probier mal den folgenden Sketch aus, den du noch an Dein Thema anpassen mußt.

const int Groesse=10;
char zeichen[Groesse];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Eingabe");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available())
  {
    char zeichenIn = Serial.read();
    static int zeichenZaehler=0;
    if (isDigit(zeichenIn)) {
      zeichenZaehler=zeichenZaehler%Groesse;
      zeichen[zeichenZaehler++] = zeichenIn;
      Serial.println(zeichen);
      Serial.println("Eingabe");
    }
  }
}

Hallo,

sieh dir mal das Beispiel ReadAsciiString an. Datei / Beispiele / Communications . Eventuell kannst Du sowas brauchen.

Heinz

sventhimsen:
Es geht mir eher um die Eingabe im seriellen Monitor.

Da ich das gerade GENAU SO schon mal geschrieben habe:

Aber Achtung! Wenn Du tatsächlich while machen willst, steckst da fest. - ob mit oder ohne meinen Codeschnipsel.

Hey,
danke für die vielen Antworten!
Ich denk ich hab das jetzt ein bisschen mehr verstanden :smiley:
Das Code Beispiel bringt mich schonmal weiter!
Ich hab das ganze jetzt auch mal runter programmiert und es funktioniert so wie ich das will. Aber vielleicht seht ihr noch wo etwas was man schöner bzw. leichter hätte lösen können, da ich auch den ein oder anderen Workaround mit eingearbeitet habe :smiley:

#include <Servo.h>
#include <Stepper.h>

#define STEPS 32

Servo servo1;
Servo servo2;
Servo servo3;

Stepper stepper(STEPS, 8, 10, 9, 11);

int LEDs = 13;
int Luefter = 12;

int servo_pin1 = 6;
int servo_pin2 = 5;
int servo_pin3 = 3;

int pos1 = 0; //Mittleres Gelenk
int pos2 = 0; //Unterstes Gelenk
int pos3 = 0; //Drehen der Lego Figur
int steps = 0;

const int Groesse=10;
char zeichen[Groesse];
int Zahl = 0;
int Grad = 0;

void setup() {
  // put your setup code here, to run once:
  servo1.attach(servo_pin1);
  servo2.attach(servo_pin2);
  servo3.attach(servo_pin3);

  stepper.setSpeed(1000);

  pinMode(LEDs, OUTPUT);
  pinMode(Luefter, OUTPUT);
  Serial.begin(9600);
  Serial.print("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, ");
  delay(700);
  Serial.println("4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
  Serial.println("");
  
  digitalWrite(LEDs, false);
  digitalWrite(Luefter, false);

  
    
  }

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() && Zahl == 0)
  {
    char zeichenIn = Serial.read();
    static int zeichenZaehler=0;
    if (isDigit(zeichenIn)) {
      zeichenZaehler=zeichenZaehler%Groesse;
      zeichen[zeichenZaehler++] = zeichenIn;
      //Zahl = atoi(zeichen);
      Zahl = zeichen[zeichenZaehler - 1] - '0';
      //Serial.println(zeichenZaehler);
      //Serial.println(zeichen[1]);
    }
  }

  if (Serial.available() && Zahl == 1)
  {
    static int hilf = 0;
    Serial.println("Das mittlere Gelenk wurde ausgewählt!");
    Serial.println("Gib die Grad Zahl an, auf den du den Motor stellen willst!");
    pos1 = Serial.parseInt();
    hilf++;
    if(hilf == 2) {
      Serial.print ("Das mittlere Gelenk wird auf ");
      Serial.print (pos1);
      Serial.println (" Grad angesteuert.");
      Serial.println("");
      servo1.write(pos1);
      Zahl = 0;
      hilf = 0;
      Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
      Serial.println("");
    }
  }

  if (Serial.available() && Zahl == 2)
  {
    static int hilf = 0;
    Serial.println("Das untereste Gelenk wurde ausgewählt!");
    Serial.println("Gib die Grad Zahl an, auf den du den Motor stellen willst!");
    pos2 = Serial.parseInt();
    hilf++;
    if(hilf == 2) {
      Serial.print ("Das untereste Gelenk wird auf ");
      Serial.print (pos2);
      Serial.println (" Grad angesteuert.");
      Serial.println("");
      servo2.write(pos2);
      Zahl = 0;
      hilf = 0;
      Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
      Serial.println("");
    }
  }

  if (Serial.available() && Zahl == 3)
  {
    static int hilf = 0;
    Serial.println("Figur oben drehen wurde ausgewählt!");
    Serial.println("Gib die Grad Zahl an, auf den du den Motor stellen willst!");
    pos3 = Serial.parseInt();
    hilf++;
    if(hilf == 2) {
      Serial.print ("Figur oben drehen wird auf ");
      Serial.print (pos3);
      Serial.println (" Grad angesteuert.");
      Serial.println("");
      servo3.write(pos3);
      Zahl = 0;
      hilf = 0;
      Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
      Serial.println("");
    }
  }

  if (Serial.available() && Zahl == 4)
  {
    static int hilf = 0;
    Serial.println("Um eigene Achse drehen wurde ausgewählt!");
    Serial.println("Gib die Schritte an, die du drehen willst!");
    steps = Serial.parseInt();
    hilf++;
    if(hilf == 2) {
      Serial.print ("Wir drehen uns um ");
      Serial.print (steps);
      Serial.println("");
      stepper.step(steps);
      Zahl = 0;
      hilf = 0;
      Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
      Serial.println("");
    }
  }

  if (Serial.available() && Zahl == 5)
  {
    Serial.println("----------LEDs werden getoggelt----------");
    Serial.println("");
    digitalWrite(LEDs, !digitalRead(LEDs));
    Zahl = 0;
    Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
    Serial.println("");
  }

  if (Serial.available() && Zahl == 6)
  {
    Serial.println("----------Luefter wird getoggelt----------");
    Serial.println("");
    digitalWrite(Luefter, !digitalRead(Luefter));
    Zahl = 0;
    Serial.println("Wähle einen Motor aus in dem du eine Zahl zwischen 1 und 4 eingibst (2 = unterstes Gelenk, 1 = Mittleres Gelenk, 3 = Fiugr oben drehen, 4 = Um eigene Achse drehen, 5 LEDs toggeln, 6 Lüfter toggeln)");
    Serial.println("");
  }
  
}

sventhimsen:
Das Code Beispiel bringt mich schonmal weiter!

:wink:

vielleicht seht ihr noch wo etwas was man schöner bzw. leichter hätte lösen können

Bevor Du Code online stellst: STRG-T UND die unnützen Leerzeilen entfernen!

Und dann lies Dich ein und mach das so:

  if (Serial.available()
   {  .....
   switch  (Zahl)

Deine ganze if-Geschichte ist kontraproduktiv.
Aus dem verlinkten Thread kannst das 1:1 übernehmen.

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