No, in quel modo proprio NON va bene ... ed ovviamente ti da problemi ... hai fatto un mix di Serial e mySerial ...
Io avevo postato un esempio generico fatto sulla Serial ... ma ovvimente dovevi ADATTARLO alla tua SoftwareSerial di nome mySerial ... :
Allora .... devi iniziare dichiarando delle define/costanti ...
#define MAXCHAR 200 // Max string lenght
#define TERCHAR 0x0D // Termination character (0x0D is CR)
#define TIMEOUT 5000 // Max waiting time (0 = unlimited)
...dove MAXCHAR intendiamo il numero massimo di caratteri utili, TERCHAR quale terminatori ti aspetti, e ... già che ci siamo implementiamo anche un TIMEOUT (espresso in millisecondi) entro il quale ti aspetti la stringa completa ... altrimenti c'è un errore.
Ti serve poi il buffer dove mettere i caratteri ricevuti, un indice, una variabile per indicare che c'è stato un errore e una variabile per il timeout ...
char inpBuffer[MAXCHAR + 1];
int idxBuffer;
byte tErrore;
unsigned long curtime;
... il buffer deve essere un carattere più lungo perché, oltre ai caratteri utili ci interessa anche il terminatore della stringa.
A questo punto ... STUDIATI come funziona la while() e la do ... while()
Dopo aver studiato e capito come funzionano, il codice che segue ti dovrebbe essere piuttosto chiaro (... è lo stesso che abbiamo già visto con in più il timeout ed una fase conclusiva) ...
tErrore = 0;
idxBuffer = 0;
curtime = millis();
//
do {
while (!mySerial.available()) {
if ( (TIMEOUT > 0) && (millis() - curTime > TIMEOUT) ) {
tErrore = 1; // tErrore = 1 significa che c'è stato un timeout
break; // esco da questo while()
}
}
if (tErrore != 0) break; // esco dal do ... while()
//
inpBuffer[idxBuffer] = mySerial.read();
curTime = millis();
} while ( (inpBuffer[idxBuffer++] != TERCHAR) && (idxBuffer < MAXCHAR + 1) );
//
if (tErrore == 0) {
// non c'è stato errore di timeout, si può passare ad effettuare le altre verifiche ...
idxBuffer--;
if (inpBuffer[idxBuffer] != TERCHAR) {
// se l'ultimo carattere NON è il terminatore, la stringa era troppo lunga, quindi errore
tErrore = 2; // tErrore = 2 significa stringa troppo lunga
// bisogna comunque svuotare il buffer
delay(5);
while (mySerial.available()) {
mySerial.read();
delay(5);
}
}
else {
// tutto ok, si inserisce il terminatore di stringa (0x00) al posto di TERCHAR
inpBuffer[idxBuffer] = 0x00;
}
}
// a questo punto, se tErrore == 0, inpBuffer contiene la stringa,
// se tErrore != 0 allora c'è stato un errore e, in particolare :
// tErrore == 1 c'è stato un timeout
// tErrore == 2 troppi caratteri ricevuti e non ricevuto il terminatore TERCHAR
... studia il codice, cerca di capirlo e dimmi cosa non ti è chiaro.
Guglielmo
P.S.: Il codice l'ho modificato al volo e non escluso qualche errore di battitura 