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
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
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
Guglielmo
Ok grazie dott Guglielmo
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.