comunicazione seriale in loop

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:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
char myar[6];
int indice = 0;
void setup()
{
mySerial.begin(19200);
Serial.begin(9600);
}
void loop()
{
indice = 0;
if (mySerial.available())
myar[0] = mySerial.read();
myar[1] = mySerial.read();
myar[2] = mySerial.read();
myar[3] = mySerial.read();
myar[4] = mySerial.read();
String s;
indice = 0;
while (indice < 5) {
s.concat (myar[indice]);
indice++;
Serial.print(s);
}
delay(1500);
}

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.

Avete delle soluzioni in mente?

Grazie
Aldo

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. http://arduino.cc/en/Reference/StringConcat

Grazie Leo72 per la risposta. Purtroppo il problema non è concat. Ho provato a toglierlo ma non è cambiato nulla.

Grazie comunque Aldo

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";

Ciao.

a vederlo così mi da di classico errore "off by one"

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.

Ciao Aldo

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

Ciao

Risolto!

Era una banalità, se così si può dire:

invece di scrivere if (mySerial.available()){

bisogna scrivere if (mySerial.available()>0){

Grazie a tutti

In particolare a MauroTec che, con il suo suggerimento sul valore di Available, mi ha messo sulla buona strada

[quote author=Aldo Rav link=topic=89258.msg670920#msg670920 date=1327870235] Risolto!

Era una banalità, se così si può dire:

invece di scrivere if (mySerial.available()){

bisogna scrivere if (mySerial.available()>0){

Grazie a tutti

[/quote] 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.

Ciao

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?

PaoloP, sto usando la 1.0. Gli Arduino sono Duemilanove e Uno. Ciao