Salve a tutti, ho un problema con la comunicazione seriale e forse mi sta sfuggendo qualcosa...
Devo far comunicare uno standalone provvisto di chip MAX232 con la porta seriale di un vecchio pc con sopra windows xp; sul pc per inviare i dati sulla seriale devo usare per forza uno script eseguito in un file bat che qui sotto riporto:
mode com1:9600,n,8,1
echo 0A& >com1
Premettendo che il MAX232 è collegato bene visto che l'ho usato diverse volte, non so per quale motivo la comunicazione non funziona a dovere, infatti tutto fila liscio soltanto se invio un solo carattere. Come vedete il file bat contiene solo due istruzioni, la prima riga setta i parametri per la comunicazione con la porta seriale e successivamente invia la stringa "0A&".
Qui sotto invece inserisco lo sketch che uso sull'arduino.
// variabili per la gestione del protocollo seriale
char serialBuffer[40]; // buffer per i messaggi che arrivano dalla seriale
int indiceBuffer = 0; // variabile per contenere l'indice dell'array
boolean msgTrasmesso = false;// dice se il messaggio è stato trasmessovoid setup()
{
delay(2000);
Serial.begin(9600);
}void loop()
{
/* trasmetto un solo carattere e funziona
if(Serial.available())
{
char lettera = Serial.read();
if(lettera == 'A')
{
accensione();
}
else if(lettera == 'B')
{
spegnimento();
}
}
*/
if(Serial.available())
{
char lettera = Serial.read();
if(lettera != '&')// '&' è il carattere di fine messaggio
{ // se quello che arriva è diverso dal carattere di fine messaggio
serialBuffer[indiceBuffer] = lettera;// popola l'array del buffer
indiceBuffer++;//incrementa l'indice dell'array del buffer per dare la posizione al carattere successivo
}
else // se è arrivato il carattere di fine messaggio
{
indiceBuffer = 0; // l'indice ritorna a 0
msgTrasmesso = true; // il messaggio è stato trasmesso
}
}
// analizza il buffer
if(msgTrasmesso == true)
{
switch(serialBuffer[0])
{
case '0':
{
switch(serialBuffer[1])
{
case 'A':
{
accensione();
}
break;
case 'B':
{
spegnimento();
}
break;
}
memset(serialBuffer,0,sizeof(serialBuffer)); // svuota il buffer
msgTrasmesso = false;
}
break;
default: // se arriva qualcosa non previsto svuota il buffer
{
memset(serialBuffer,0,sizeof(serialBuffer));
msgTrasmesso = false;
}
}
}
}
Le istruzioni commentate nel loop le ho inserite per vedere se effettivamente arriva qualche dato e funzionano alla perfezione; in questo modo trasmetto un solo carattere dal file bat.
Lo sketch che non mi funziona invece prevede l'arrivo di più caratteri: il primo '0', il secondo 'A' e infine il carattere '&' che ho utilizzato come carattere di fine messaggio. Ogni volta che arriva un carattere e se questo è diverso da '&', lo vado ad inserire in un array incrementandone l'indice fino a quando non arriva il carattere di fine messaggio (l'ho spiegato da cani, ma credo che si capisca dai....). Giusto per completare il discorso dico che entrambi gli switch che ho messo mi servono perchè devo gestire più messaggi.
Perchè non funziona questo codice? Mi sa che mi sto perdendo per una sciocchezza....
Help
Edit:
So che la faccenda di incrementare l'indice per l'array è proprio una porcheria, avevo provato con la funzione while(Serial.available()) ma non funzionava ugualmente....