[RISOLTO]stringhe e buffer

Salve, so che questo é un argomento molto trattato, ma leggendo le varie discussioni non sono riuscito a risolvere il mio problema.
Mi sto esercitando sulle input da tastiera con arduino, la mia idea é quella di inserire una parola arbitrariamente lunga e immagazzinare solo le prime 5 lettere. Le altre le vorrei cancellare. Una volta premuto invio stampare l'array di 5 lettere. Il prossimo array che vorrei fosse stampato dovrebbe avere le NUOVE 5 lettere di una NUOVA parola. Invece il programma mi stampa tanti array tagliando la parolona in 5 parole.

Ad esempio se io scrivo:

"forumarduino"

, viene stampato:

array numero(1)
forum
array numero(2)
ardui

Io invece vorrei che venisse stampato:

array numero(1)
forum

e

arduino

cancellato.

Ecco il mio codice:

char array[6];
byte i=0;
byte count=0;
void setup() {
  Serial.begin(9600);
  Serial.println("Questo programma inserisce in un array le prime 5 lettere inserite:");

}

void loop() {
  if (Serial.available() >0){
    array[i] = Serial.read(); //legge un byte e lo inserisce nell'elemento i-esimo dell'array
    i++;
    if (i== 5){  //per non "sforare" l'array
      array[i]= '\0';
      i = 0;
      count = count +1; //conta il numero si array
      svuotabuffer(); //legge tutte le lettere dopo la quinta
      Serial.print("array numero(");
      Serial.print(count);
      Serial.print(")\n");
      Serial.write(array);
      Serial.println();
    }
  }
}
void svuotabuffer(){ //Questa funzione scarta tutte le lettere inserite dopo la quinta,
                     //cosí nel prossimo array non vengono stampate
  while(Serial.available()){
    byte temp = Serial.read();
  }
  }

Con Arduino ho creato (leggendo sul forum) la funzione svuotabuffer, ma visto che non funziona credo di non aver afferrato bene cosa faccia. Grazie mille

La svuotabuffer() funziona se tu ricevi, senza interruzioni, una stringa più lunga di X e vuoi scartare tutto quello che c'è in più.

Tu stai leggendo da tastiera, quindi sei, per la velocità di elaborazione della MCU, peggio di una lumaca e i caratteri arrivano una ad uno e vengono processati singolarmente. Se tu al 5 già stampi tutto e poi chiami la svuotabuffer(), il 6 carattere non è ancora arrivato (tu lo devi ancora premere) e quindi non serve a nulla.

Nel caso invece in cui tu usassi un emulatore di terminale che invia TUTTA la stringa solo quando lo dici tu ...
... vedrei comunque un altro problema sempre legato alle velocità per cui la svuotabuffer() potrebbe uscire prima di aver veramente svuotato i caratteri disponibili (in tal caso, un piccolo delay di 1 o 2 ms nel ciclo di svuotamento dovrebbe aiutare).

Ma, in entrambi i casi, anche la logica è sbagliata ... la giusta logica sarebbe ...
... leggere carattere a carattere fino a che non si riceve un qualche cosa che indica la fine della stringa (esempio il CR), ma memorizzate solo i primi X caratteri ricevuti, scartando direttamente i successivi. Altrimenti NON hai alcun riferimento sulla fine di una stringa e l'inizio della successiva.

Guglielmo

Grazie mille per la risposta veloce ed esauriente, ho modifcato la svuotabuffer() cosí:

void svuotabuffer(){ //Questa funzione scarta tutte le lettere inserite dopo la quinta,
                     //cosí nel prossimo array non vengono stampate
  while(Serial.read() != '\n');}

e mettendo nel serial monitor New line
Avevo giá provato a fare cosí, ma non risolveva (credo perché non selezionavo l'opzione del NL).
Dovrei aver risolto giusto?
Chiedo se ci possono essere altre strade piú efficienti di questa.

SI, probabilmente NON ti serve la svuotabuffer() ...
... il controllo lo puoi fare direttamente nel ciclo che riceve i caratteri, tanto li stai contando, arrivato a N non li memorizzi più e, riconosciuto il CR, fai quello che devi fare con gli N caratteri ricevuti e poi cominci ad elaborare la stringa successiva :wink:

Guglielmo

gpb01:
SI, probabilmente NON ti serve la svuotabuffer() ...
... il controllo lo puoi fare direttamente nel ciclo che riceve i caratteri, tanto li stai contando, arrivato a N non li memorizzi più e, riconosciuto il CR, fai quello che devi fare con gli N caratteri ricevuti e poi cominci ad elaborare la stringa successiva :wink:

Guglielmo

Quello che mi stai dicendo é di cancellare la funzione e mettere il ciclo while al posto della chiamata?

Sei ne loop() quindi giri in continuazione ...

... leggi carattere
... è il CR ? fai quello che devi fare
... indice minore di N, lo memorizzi altrimenti lo ignori
... incrementi indice

Piuttosto semplice direi :wink:

Guglielmo

gpb01:
Sei ne loop() quindi giri in continuazione ...

... leggi carattere
... è il CR ? fai quello che devi fare
... indice minore di N, lo memorizzi altrimenti lo ignori
... incrementi indice

Piuttosto semplice direi :wink:

Guglielmo

Per complicarmi la vita sono un asso....
Grazie mille!!