Serial.find() e buffer delucidazioni

Salve a tutti, eccomi di nuovo a chiedere 'lumi' ai più esperti, giocherellando con l'esp8266 mi sono imbattuto in sketch dove veniva usata la funzione serial.find() che come descritto nel reference ricerca una stringa nel buffer e restituisce un valore booleano, il mio dubbio è, dopo aver richiamato questa funzione il buffer si svuota o no? Nel caso non lo facesse come posso svuotare il buffer? Grazie mille per le risposte :slight_smile:

Non è scritto da nessuna parte che svuoti il buffer (... e, se guardi nel core il sorgente nella classe Stream, che è quella ereditata dalla Serial, vedi che non effettua alcuno svuotamento). Per svuotare il buffer ... devi leggere i dati (... se non ti servono, un loop stretto di Serial.read() e passa la paura) visto che la Serial.flush() (... che molti credono svuoti il buffer) in realtà fa tutt'altro :wink:

Per completezza ...

 // find returns true if the target string is found
bool  Stream::find(char *target)
{
  return findUntil(target, strlen(target), NULL, 0);
}

// reads data from the stream until the target string of given length is found
// returns true if target string is found, false if timed out
bool Stream::find(char *target, size_t length)
{
  return findUntil(target, length, NULL, 0);
}

// as find but search ends if the terminator string is found
bool  Stream::findUntil(char *target, char *terminator)
{
  return findUntil(target, strlen(target), terminator, strlen(terminator));
}

// reads data from the stream until the target string of the given length is found
// search terminated if the terminator string is found
// returns true if target string is found, false if terminated or timed out
bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen)
{
  if (terminator == NULL) {
    MultiTarget t[1] = {{target, targetLen, 0}};
    return findMulti(t, 1) == 0 ? true : false;
  } else {
    MultiTarget t[2] = {{target, targetLen, 0}, {terminator, termLen, 0}};
    return findMulti(t, 2) == 0 ? true : false;
  }
}

Guglielmo

Infatti non avendolo letto nel reference mi chiedevo se svuotasse o meno il buffer, per svuotarlo quindi mi dici di eseguire un ciclo di read() , se invece facessi serial.end() e serial.begin() ci sarebbe qualche controindicazione?

essereumano:
... se invece facessi serial.end() e serial.begin() ci sarebbe qualche controindicazione?

Mmm ... così su due piedi non me ne viene in mente nessuna :grin:

Guglielmo

Ok grazie dott Guglielmo :smiley:

Dipende dalla sorgente dei dati che leggi dalla seriale.
Io opterei per la lettura.

È un esp 8266, non credo che dia problemi in tal senso.