Arduino + Xbee S1, problema di lettura caratteri seriale gateway

Salve ragazzi, ho 2 arduino rispettivamente con due moduli Xbee S1 (http://www.libelium.com/squidbee/upload/3/31/Data-sheet-max-stream.pdf)

|----------| |------------|
| NODO | | || GATEWAY |
|----------| |------------|

Vorrei leggere tramite seriale del gateway (non collegandolo al pc) i dati che il nodo (o nodi) manda. Utilizzando il seguente codice:

#define MAX 30
char stringa [MAX]="";
char c;
int count=0, j=0;

void setup() {
Serial.begin(9600);
Serial.flush();
}

void read_print_serial(){
c = Serial.read();
Serial.println(c);
stringa[j]=c;
j++;
if((c=='\n') || (j==(MAX-1))) {
Serial.print("Stringa: ");
int x;
for(x=0;x<j;x++){
Serial.print(stringa[x]);
stringa[x]='\0';
delay(500);
}
Serial.println("\r");
j=0;
}
}

void loop() {
read_print_serial();
}

Ottengo valori strani. :~ . Come posso risolvere questo problema? Dato che successivamente li vorrei memorizzare su una sd e leggerli da remoto tramite l'ethernet shield.

Ho provato, invece il gateway collegato al PC (cioè senza atmega 328),

|----------| |------------| |----------|
| NODO | | || GATEWAY |----- USB -----| PC |
|----------| |------------| |----------|

con il seguente programma in linguaggio c che mando dal pc:

http://www.libelium.com/squidbee/index.php?title=Receiving_data_with_the_Gateway_in_Linux

e riesco a leggere i dati.

grazie in anticipo.

a naso direi che i dati ti stanno arrivando a 19200 baud e non 9600

Grazie per la dritta, ho provato ma non è un problema di baud rate.
Penso che forse il problema sia dovuto alla sincronizzazione dei moduli xbee.
Attualmente sono messi in AT mode, dovrei metterli in modalità API?
Questo e' l'output che vedo con minicom dal gw (sto acquisendo dati di temperatura, umidita' e luminosita'):

Stringa: ?????????????????????????????
Stringa: 1,1.04,40.33,24.27]

Stringa: [1,0.93,40.96,24.54]

Stringa: [1,1.00,40.01,24.54]

Stringa: [1,0.74,40.6[1,0.76,40.64,24.
Stringa: 54]
Nella prima stringa il buffer non legge nulla anche se il nodo invia dati, e poi nell'ultima che ho postato perdo un dato che poi viene ristampato in una stringa successiva.
Se utilizzo la modalità API devo comunque fare il controllo con un programma in C che gira sul microcontrollore del GW, o la sincronizzazione avviene semplicemente con le API?
C'e' qualche esempio on line? Io non sono riuscito a trovare nulla...
Grazie e scusate se mi sono dilungato troppo.

togli il flush, che non credo ti serva.

stai sbagliando anche quì:

stringa='\0';

a parte che non vedo cosa serva porre la stringa a '\0' DOPO la print: semmai devi farlo PRIMA!
stai dando a stringa l'indirizzo di '\0', una stringa creata apposta all'interno di un IF, quindi appena termina l'if il '\0' "muore" e il tuo puntatore stringa, oltre a non puntare più all'array di dimensione MAX, ma a una singola cella contenetente '\0' nell'if, a fine if punterà ad una zona di memoria in cui probabilmente c'è ancora \0, mo potrebbe essere anche utilizzata per altro. E dato che tu usi quel puntatore come array, inutile sottolineare che le probabilità che i dati contenuti vengano riscritti da qualche altra variabile, o vadano a riscrivere qualche altra variabile, aumenta.

quindi correggi da

for(x=0;x<j;x++){
   Serial.print(stringa

    );

   stringa

    ='\0';

   delay(500);
  }

a

for(x=0;x<j;x++){

   stringa[j]='\0'; //mette lo \0 o al posto dello \n o al posto dell'ultimo carattere, che viene quindi perso
   Serial.print(stringa);
   delay(500);
  }

fondamentalmente è errato anche il =""; nella dichiarazione dell'array; non sono sicuro che vada a popolare il tuo array, quanto piuttosto crearne uno di dimensione apposita ed assegnarlo, infatti

char stringa []="asd";

è una scrittura corretta, perchè stringa punterà ad un array di 3 elementi, e può anche essere scritto come:

char *stringa="asd";

Perfetto adesso funziona :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:
Il codice che ho utilizzato e' questo:

#define MAX 30

char stringa [MAX];
char c;
int count=0, j=0;

void setup() {
Serial.begin(19200);
}

void read_print_serial(){
c = Serial.read();
stringa[j]=c;
j++;
if((c=='\n') || (j==(MAX-1))) {
Serial.print("Stringa: ");
stringa[j]='\n';
for(int x=0;x<j;x++){
Serial.print(stringa[x]);
delay(500);
}
Serial.println("\r");
j=0;
}
}

void loop()
{
while (Serial.available() ) {
Serial.write(Serial.read()); // reply with whatever you receive
}

ascolta, non va bene
stringa[j]='\n';
ci vuole lo stesso il
stringa[j]='\0';
perchè indica proprio il carattere di fine stringa che è obbligatorio. Magari ti funziona bene adesso ma poi può andarti in casino (anzi dovrebbe farlo nel momento in cui riceve una stringa più corta della precedente)

tanto poi lo \n vene già aggiunto dalla
Serial.println("\r");
non capisco perchè metti lo \r, è uno standard windows che però non dovrebbe incidere