Invio stringa su seriale e mancato/errato riconoscimento

Salve,

due Arduino (Uno ed Mega) collegati tramite seriale via filo che comunicano correttamente:
l'Uno invia tramite seriale una stringa del tipo Id1>2on, che viene ricevuta correttamente dal Mega (controllato via terminale).
Sul Mega c'è questo sketch

#define indexIn 4		// stabilisce il numero di input
String readString;
#define led 13

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {


  if (Serial.available())  {	// se ci sono dati nel buffer
    char c = Serial.read();        // legge il primo byte dal buffer
    delay(100);  
    if (c == ',') {
    	//Serial.print(readString);   debug
      if (readString.length() > 0) {
        if(readString == "Id1>2on"){
        	digitalWrite(led, HIGH);
        }
        
        if(readString == "Id1>2off"){
        	digitalWrite(led, LOW);
        }
        readString=""; //azzera la variabile per nuovo input
      }
    }  
    else {
      readString += c;	//aggiunge carattere  a  readString
    }
 }
}

Il comportamento strano è che inviando la stringa Id1>2on il led si accende correttamente mentre l'invio della seguente Id1>2off (pur arrivando correttamente a destinazione) non provoca lo spegnimento. Ho controllato più volte ma a me "sembra" concettualmente corretto. Potrebbe essere un problema di tempi ??
Grazie

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

A me il codice pare corretto. Quindi questa:

//Serial.print(readString);   debug

In tutti i casi, senza commento, ti segnala che la Mega legge giusto? Le parole sono "esatte" ?

P.S. le define di solito tutti i programmatori C le mettono maiuscole

#define LED 13

Meglio ancora usare le costanti per definire questi tipi di valori fissi, a cui puoi anche stabilire il tipo:

const byte pinLed=13;

Ciao, ti ringrazio della risposta:

sto imparando per cui alcuni chiarimenti

hai citato questa riga

//Serial.print(readString);   debug

ma non capisco cosa intendi dire

Ti confermo che il testo inviato e controllato è corretto.

Leggendo ho provato a modificare questo spezzone di codice ed ho di fatto risolto

     if (readString.length() > 0) {
      	readString.trim();
      	Serial.println(readString);
        if(readString == "Id1>2on"){
        	digitalWrite(led, HIGH);
        }

Aggiungendo un
readString.trim();

ora funziona ma mi piacerebbe capire cosa va ad eliminare il comando dato che nella stringa non ci sono caratteri vuoti visibili.

Per quanto riguarda la forma di scrittura, non lo sapevo...
Leggevo che l'uso di #define fa risparmiare un po' di memoria e molti dicono che, come dici tu, che è meglio non utilizzarlo... mi piacerebbe capirne il motivo :wink:
Grazie comunque per l'interessamento.

Franchelli:
Per quanto riguarda la forma di scrittura, non lo sapevo...
Leggevo che l'uso di #define fa risparmiare un po' di memoria e molti dicono che, come dici tu, che è meglio non utilizzarlo... mi piacerebbe capirne il motivo :wink:
Grazie comunque per l'interessamento.

Al posto di #define usa la const, fa la stessa cosa, non occupa memoria, ma la define è solo una sostituzione brutale della parola con il valore e può essere "interpretato" male dal pre-compilatore. Ci sono casi di comportamento "strano".

Per il trim, allora nella stringa ci sono caratteri non visualizzabili, magari 13 e 10, newline e a capo, magari puoi verificarli e non aggiungerli alla stringa.

if (c == ',') 
{ ... il tuo codice
}
else if( c == 10 || c==13 ) // non fare nulla, salta se 10 o 13
{}
else 
{ readString += c;   //aggiunge carattere  a  readString
}