Doppia richiesta dati da seriale

Sto cercando di passare un numero proveniente da seriale (serial monitor di arduino) e successivamente chiedo conferma per effettuare un’azione.

Lo sketch:

void setup() {
  Serial.begin(9600);
  Serial.println("Inserisci il numero e poi premi invio");
}

void loop() {
  char numero;
  if (Serial.available()) {
    numero = Serial.read();
    if (numero == '\n') {
      Serial.println("numero inserito: " + n_numero);
      delay(200);
      ///svuoto il buffer
      unsigned long now = millis ();
      while (millis() - now < 1000)
        Serial.read ();
      ///ora chiedo conferma SI o NO
      Serial.println("Premi 's' per proseguire con la scrittura, premi 'n' per annullare");
      if (Serial.available()) {
        byte command = Serial.read(); //leggo il primo byte
        Serial.println("Valore di command " + command); //per debug
        switch (command) { //controllo che sia un comando valido
          case 's': //lettura
            //invio procedo con scrivi()
            Serial.println("PROCEDO CON LA SCRITTURA");
            scrivi(n_numero);
            break;
        }
        switch (command) { //controllo che sia un comando valido
          case 'n': //lettura
            Serial.print("OPERAZIONE ANNULLATA");
            return;
        }
      }
    }
    else {
      n_numero += numero;
    }
  }
}

void scrivi(String n_numero) {
  Serial.println("NUMERO:" + n_numero);
  n_numero = "";
}

Questo è il risultato su monitor seriale (dopo aver inserito un numero a caso ed aver premuto s o n):

Inserisci il numero e poi premi invio
numero inserito: 123
Premi 's' per proseguire con la scrittura, premi 'n' per annullare
numero inserito: 123s
Premi 's' per proseguire con la scrittura, premi 'n' per annullare
numero inserito: 123sn
Premi 's' per proseguire con la scrittura, premi 'n' per annullare

Perché continuo ad aggiungere caratteri al numero inserito all’inizio? (123 → 123s → 123sn…)
In pratica sembra non entrare in switch/case…

Grazie!

switch (command) { //controllo che sia un comando valido
          case 's': //lettura
          case 'S':
            //invio procedo con scrivi()
            Serial.println("PROCEDO CON LA SCRITTURA");
            scrivi(n_numero);
            break;
          case 'n':
          case 'N':
            Serial.print("OPERAZIONE ANNULLATA");
            return;  
        }

Non ho capito perché due swicht quando ne basta uno come quello sopra, c’è qualcosa che mi è sfuggito?

byte mState = 0;
byte charCounter = 0;
byte commandString[3];

void loop() {
  char numero;
  if (Serial.available()) {
    byte numero = Serial.read();
    if (numero && charCounter <3) {
       commandString[charCounter] = numero;
       charCounter++; 
    }
  
    if (charCounter == 2) {
      Serial.print("Comando inserito: ");
      Serial.println(commadString);
      switch (command) { //controllo che sia un comando valido
          case 's': //lettura
          case 'S':
            //invio procedo con scrivi()
            Serial.println("PROCEDO CON LA SCRITTURA");
            scrivi(n_numero);
            charCounter = 0;
            break;
          case 'n':
          case 'N':
            Serial.print("OPERAZIONE ANNULLATA");
            charCounter = 0;
            break;  
        } 
    }
  } // end if Serial.available()
}

Dovrebbe essere possibile fare tutto con un solo if (Serial.available()) {
e una sola read, senza necessità di svuotare il buffer e senza delay.

PS: non provato editato al volo sul forum

Il comportamento del tuo programma è dovuto al fatto che hai inserito il codice dentro un if.

Ti spiego il comportamento del tuo programma

  1. if(controllo dati da seriale){

  2. acquisisco numero

  3. chiedo di inserire un comando

  4. if(controllo dati da seriale)

/* Quando chiedi si inserire il comando, questo sencondo if riga 4, viene già eseguito e risulta falso, per cui il programma torna all'if di riga 1, legge il carattere e con l'else lo concatena al numero.

*/

Potresti mettere una pausa prima del secondo if while(!Serial.available());

in questo modo attende che ci sia un carattere sulla seriale.

}

Grazie mille torn24!
Grazie per avermi fatto capire il mio errore (la logica di funzionamento del programma) e per la dritta.
Ora funziona.

Chiedo un'altra cortesia: abituato al basic sin dai tempi del commodore64 utilizzavo i "GOTO". Ora, dopo che ho eseguito la funzione "scrivi" oppure anche premendo 'n' per annullare, il tutto torna a

numero inserito: 123
Premi 's' per proseguire con la scrittura, premi 'n' per annullare

Io invece vorrei tornare all'inizio dove mi chiede di inserire un nuovo numero (inizio del void loop).
La mia idea è mettere una ulteriore condizione (if tessera scritta salta tutto il resto) per tornare all'inizio.
C'è un più modo intelligente/corretto?

EDIT: va beh... ho scritto una scemata.. il codice gira di continuo in loop. Ho messo un if iniziale per verificare se deve scrivere un nuovo numero. Il problema è che arriva alla condizione

if (numero == '\n') {
      Serial.println("numero inserito: " + n_numero);

e la considera vera. Come se da seriale arrivasse il "\n" cosa invece che io non faccio...

Non sto a rieditare il messaggio precedente ma ho trovato l'inghippo:
ultimo "Serial.println(".....")" lascia il carattere new line (\n) nel buffer seriale.
Mi è bastato svuotare il buffer alla fine della funzione scrivi() per sistemare il tutto.
Continuo nel mio progettino.

Grazie ancora per il supporto!