kleines Menü über seriellen Montior steuern

Guten morgen,

ich wollte mir ein kleines Menü schreiben, dass ich über das serielle Terminal bedienen kann, um einen Colorduino zu testen. Leider klappt das Menü nicht so wie es soll. Vokalem Wenn man C ausgewählt hat, sind die Eingaben schon vorgelegt und er 'wartet' nicht auf neue Parameter. Vielleicht kann mir ja einer von euch weiterhelfen.

Gruss
Nobi

void loop()
{
  Serial.flush();
  char Wahl;
  int R=0,G=0,B=0,x=0,y=0,i=0,j=0,k=0,l=0,m=0;
  Serial.println("WAS MOECHTEN SIE TUN:");
  Serial.println("--------------------------------------------------");
  Serial.println("Alles Ein                                      ->A");
  Serial.println("Alles Aus                                      ->B");
  Serial.println("Ein Pixel veraendern                           ->C");
  Serial.println("--------------------------------------------------");
  Serial.print("Ihre Auswahl: ");
begin:
  if (Serial.available())     //Wenn Eingabe erfolgt
  {
    Wahl=Serial.read();       //Hole eingegebenes Zeichen
      Serial.flush();
    Serial.println(Wahl);     //Zeige eingegebenes Zeichen
    switch(Wahl)              //Auswahlsteuerung
    {
    case 'A':    
      ColorFill(255,255,255);  
      loop();
      break;
    case 'B':    
      ColorFill(0,0,0);  
      loop();
      break;
    case 'C':
      Serial.print("X-Koordinate: ");  
      do{
        if (Serial.available()) 
        {
          x=Serial.read();   
          Serial.println(x,DEC); 
          i++;
        }
      } 
      while(i<1);
      Serial.print("X-Koordinate: ");  
      do{
        if (Serial.available()) 
        {
          y=Serial.read();   
          Serial.println(y,DEC); 
          j++;
        }
      } 
      while (j<1);
      Serial.print("R-Wert: ");  
      do{
        if (Serial.available()) 
        {
          R=Serial.read();   
          Serial.println(R); 
          k++;
        }
      } 
      while (k<3);
      Serial.print("G-Wert: ");  
      do {
        if (Serial.available()) 
        {
          G=Serial.read();   
          Serial.println(G,DEC); 
          l++;
        }
      } 
      while (l<3);
      Serial.print("B-Wert: "); 
      do { 
        if (Serial.available()) 
        {
          B=Serial.read();   
          Serial.println(B,DEC); 
          m++;  
        }
      }
      while (m<3);
      Colorduino.SetPixel(x,y,R,G,B);
      loop();
      break;
    default:                      //Falsche Eingabe
      Serial.println("FALSCHE EINGABE");
      delay(2000);
      loop();
      break;
    } 
  }
  goto begin;
}

also, der erste Teil Deines Menüs funktioniert. Ich gehe davon aus, dass Du das serielle Terminal von Arduino verwendest. Ich habe mir mal ein ähnliches Programm für die Einstellung von Servos geschrieben. Mir ist aufgefallen, dass Du bei vor Deiner Koordinateneingabe nicht den Puffer löscht. Das Terminal sendet nach jeder Eingabe noch ein return. Der Arduino dürfte in der Programmabarbeitung etwas schneller sein als die serielle Verarbeitung des Terminals. Dein Serial.flush(); könnte so "verpuffen". Versuche es mal nach dem
case 'C':
Serial.print("X-Koordinate: "); mit einem Serial.flush();
Ich würde diese Funktion nach jeder Serial.print Funktion, also unmittelbar vor der do while Schleife aufrufen.

Noch ein Hinweis: Du solltest am Ende Deiner Abfragen die Variablen für die do while Schleifen auf null setzen. z.B.
break;
}
}
goto begin;

Nachtrag:
Da war ich wohl zu schnell beim Senden:

Noch ein Hinweis: Du solltest am Ende Deiner Abfragen die Variablen für die do while Schleifen auf null setzen. z.B.
break;
}
i = 0;
j = 0; usw
}
goto begin;

ich habe nach deinem Eintrag folgendes gefunden:

int SerialReadInt() {
  int SERIALREADWAIT=10;
  // The string we read from Serial will be stored here:
  char str[32];
  str[0] = '\0';
  int c=0;
  while(1<2) {
    // See if we have serial data available:
    if (Serial.available() > 0) {
      // Yes, we have!
      // Store it at next position in string:
      str[c] = Serial.read();
      // If it is newline or we find a variable separator, then terminate the string
      // and leave the otherwise infinite loop:
      if (str[c] == '\n' || str[c] == '\0') {
        str[c] = '\0';
        break;
      }
      // Ok, we were not at the end of the string, go on with next:
      else
        c++;
    }
    // In case there are not serial data available, make a short pause before retrying:
    else
      delayMicroseconds(SERIALREADWAIT);
  }
  // Convert the string to int and return:
  return(atoi(str));
}

der Vorteil ist, dass man keine Zählvariablen mehr braucht und das CR/LF auch direkt erkannt wird. Eine schöne Lösung, wie ich finde.
Bei meiner Lösung war noch das Problem, dass in den Variablen die ASCII Nummern standen also 1=49 usw. deswegen hab ich nicht für den anderen Weg entschieden.

Gruss

Hallo Noby,

auch ne Lösung. Auch ich bin mehr für einzelne kleine Funktionen die dann aufgerufen werden.

In diesem Sinne: Gnampf