Salve a tutti.
Sto cercando di far dialogare 2 Arduino con SoftwareSerial e mi trovo di fronte ad uno strano problema. Dopo aver passato ore ed ore nel cercare la soluzione mi sono deciso a chiedere il vostro aiuto.
Il primo Arduino invia una stringa di 5 caratteri al secondo Arduino -->{1234<--- Il problema è che se trasferisco questa stringa in un array il sistema entra in un loop in quanto continua a ricevere messaggi. Questo anche staccando il primo Arduino.
Dopo diversi tentativi mi sono reso conto che dipende dal quinto carattere: se metto nell'array i primi 4 la comunicazione si interrompe correttamente, se metto il quinto entra in loop e continua a stampare la stringa inviata.
Questo il codice:
Se tolgo myar[4] = mySerial.read(); il programma funziona perfettamente. Ho provato di tutto: cambiare la dimensione dell'array, inviare una stringa con 4 o 6 caratteri invece di 5, mettere un delay tra un mySerial.read e l'altro, alzare ed abbassare la velocità di trasmissione, mettere un while invece di elencare i diversi elementi dell'array, cambiare la stringa inviata: funziona sempre tutto basta che non ci sia il quinto elemento. Saltare il quinto e passare subito al sesto non funziona, così come invertirne l'ordine.
Non vorrei che l'errore fosse nell'uso del metodo .concat dell'oggetto String. Serve infatti per concatenare 2 stringhe ma tu passi solo 1 array di tipo char come parametro.
il metodo available ritorna un'intero, ma non è detto che questo sia di valore 5, specie all'inizio avrà valore 1, gli altri read potrebbe non leggere nulla dal buffer perchè ancora il dato non è stato spedito.
Poi hai già un char, spedisci quello con la seriale, invece di fare concat, l'ultimo elemento (indice 5) deve essere "\0", una cosa del tipo myar[5] = "\0";
Grazie BrainBooster per la risposta.
Purtroppo il problema non è questo: ho fatto diverse prove creando un array più grande o partendo da 0 invece che da 1 e viceversa, ma niente da fare.
Grazie MauroTec per la risposta.
Tra le molte prove effettuate, una prevedeva dei delay(x) tra un myar[x] = mySerial.read() e l'altro ma non è cambiato nulla.
Ho provato anche a cambiare il data rate per la comunicazione ma ancora nulla cambiato. Con qualsiasi baud rate e delay il sistema riceve correttamente i primi quattro caratteri e, dopo il quinto, entra nel loop.
Anche la prova togliendo concat ha dato esito negativo.
Per quanto riguarda "\0", credo si usi quando la stringa ha una lunghezza sconosciuta a priori. La successiva iterazione tra gli elementi dell'array si interrompe quando trova questo carattere. Nel mio caso, invece, la stringa ha una lunghezza fissa.
Comunque provo ad utilizzare questo suggerimento e vi aggiorno al più presto
Boh... le sintassi sono equivalenti. In C un dato è TRUE quando è maggiore di 0, quindi mettere la prima o la sintassi dovrebbe essere indifferente, a meno che il compilatore non traduca le 2 sintassi in assembly differente.
Boh... le sintassi sono equivalenti. In C un dato è TRUE quando è maggiore di 0, quindi mettere la prima o la sintassi dovrebbe essere indifferente, a meno che il compilatore non traduca le 2 sintassi in assembly differente.
Leo,
non conosco il C in quanto programmo in VB, quindi non sono in grado di commentare il tuo appunto. In effetti questo sistema funziona, quello precedente no.
Rimangono altri misteri, cioè perchè il loop partiva dal 5° record e non prima.
Se nel proseguo del lavoro di comunicazione troverò altre possibile spiegazioni, mi farò vivo.
Ci sono differenti versioni della libreria SoftSerial. Quella inclusa nell'IDE 1.0 include le modifiche della NewSoftSerial.
Quale IDE stai usando per la compilazione?