[Risolto] Xbee:inviare 2 o più valori contemporaneamente

Salve a tutti! Come da titolo sono di nuovo alle prese con gli xbee.
Tempo fa avevo fatto un progetto per pilotare una macchina tramite dei valori che ricevevo da processing. Ora, siccome dovevo ricevere i valori di accelerarione e direzione facevo una cosa tipo: arduino.write(acc); arduino.write(dir);
Lato arduino invece:

if(mySerial.available()>0){
    acc=mySerial.read();
    delay(15);
    dir=mySerial.read();
    Serial.print(acc);
    Serial.print("  ");
    Serial.println(dir);
  }

Diciamo che funziona o almeno funzionava..! Oggi mi accorgo che ogni tanto i valori si invertono, quindi se acc=100 e dir=5 magari ogni tanto mi arriva:
5 100

Succedeva prima, ma proprio di rado!

Voi come risolvereste/avete risolto questo problema? Accompagnate il valore con un "carattere di riconoscimeto"? Se si, come leggete lato arduino?

Grazie in anticipo :smiley:

Metterei una lettera per individuare quale valore stai trasmettendo. Oppure usa una carattere di partenza valori.
Ciao Uwe

uwefed:
Metterei una lettera per individuare quale valore stai trasmettendo. Oppure usa una carattere di partenza valori.
Ciao Uwe

Ok, ma come? Devo lavorare con me stringhe?
Tempo fa avevo visto qualche esempio ma non riesco più a trovare niente..

ciao

ti che tipo-dato sono i valori che invii? Dei semplici int (o byte) oppure delle stringhe?

lucadentella:
ciao

ti che tipo-dato sono i valori che invii? Dei semplici int (o byte) oppure delle stringhe?

Interi :slight_smile:

Potresti inviare una stringa con arduino.print() del tipo

nomeValore:valore

quindi quando vai a leggere con read() devi comparare nomeValore con quello che interessa a te, ad esempio con un for, per capire quale dato è arrivato e quindi estrarre il valore dalla stringa

Ciao
G

GWolf:
Potresti inviare una stringa con arduino.print() del tipo

nomeValore:valore

quindi quando vai a leggere con read() devi comparare nomeValore con quello che interessa a te, ad esempio con un for, per capire quale dato è arrivato e quindi estrarre il valore dalla stringa

Ciao
G

Ma come faccio a prendere il messaggio lettera per lettera?
Una volta che faccio un Serial.read() non ottengo tutta la stringa?

La stringa non è altro che un vettore di caratteri, quando chiami stringa[n] ottieni un dato char corrispondente all'n-esimo carattere della stringa stessa.
Quindi con un ciclo del tipo

for(int i=0;i<lunghezza;i++){

char catttere = stringa[n]; //n-esimo carattere

}

Ciao
G

GWolf:

Grazie mille :slight_smile:
Tramite XCTU mando un pacchetto del tipo "a250b" e con questo codice diciamo che ottengo quello che volevo, a parte un problemino:

void loop(){
  if(my.available()>0){
    val=my.read();
    
    if(val=='a'){
      val=my.read();
      
      while(val!='b'){
        Serial.print(val);
        string+=val;
        val=my.read();
      }
      Serial.print(string);
    }
    
  }
  
}

La stringa in uscita è: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ250
Il che mi fa pensare che tra l'invio della "a" e l'invio del 250 ci sia un attesa, anche se mi sembra strano visto che lo mando come pacchetto intero. Addirittura se lo faccio tramite DOS (invio prima la "a" poi il 250 e poi la "b") la stringa diventa:
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ÿÿÿÿÿÿÿÿÿÿÿÿ50
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Il che dovrebbe confermare che le "ÿ" equivalgono a "non sto ricevendo un cazz..".
In ogni caso, potrei filtrare la stringa con un IF.. ma non posso mettere if(val=="ÿ") ! Con cosa potrei confrontare?
Altrimenti può esere che il mio codice sia inappropriato?

Prova a stampare semplicemente i caratteri ricevuti

char c = Serial.read();
Serial.println(c);

E vediamo cosa esce

Ciao

G

GWolf:
Prova a stampare semplicemente i caratteri ricevuti

char c = Serial.read();
Serial.println(c);

E vediamo cosa esce

Ciao

G

Ci avevo già provato ed effettivamente esce: a 250 b
E questo smentisce la mia "teoria" :smiley:

Quindi la stringa è (senza apici ovviamente)
'a123b' giusto?

Ora, il tuo scopo qual è a questo punto? Memorizzare 123?

Ciao

G

GWolf:
Quindi la stringa è (senza apici ovviamente)
'a123b' giusto?

Ora, il tuo scopo qual è a questo punto? Memorizzare 123?

Ciao

G

Si, la "b" l'ho messa per sapere che da li iniziano altri valori(anche se ancora non ci sono)

P.S: Per le "ÿ" che ricevo solo dentro al while.. Non è che il while cicla troppo veloce rispetto al loop (ipotesi senza base)?
Ho provato con il if(val==ÿ) ma niente ahah :stuck_out_tongue:

quello che dovresti fare è qualcosa del genere

#define SIZE 3 //il numero di caratteri massimo che formano il numero
char c;
while((c = Serial.read() != 'a'){} //leggi fino ad 'a'

//a questo punto il prossimo carattere ottenuto con Serial.read(); sarà quello successivo ad 'a'

char buf;
int i = 0;
while((c = Serial.read()) != 'b'){ //fino a quando non arrivi a b
buf[i++] = c;
}

//ora in buf hai una stringa con il numero

Ovviamente è solo un'indicazione, se la comunicazione deve trasmettere molti dati (es. a123b234c123...) conviene usare altri mezzi per ridurre il codice e rendere tutto più flessibile, altrimenti ci vorrebbe un while per ogni dato

Ciao

G

GWolf:
quello che dovresti fare è qualcosa del genere

#define SIZE 3 //il numero di caratteri massimo che formano il numero
char c;
while((c = Serial.read() != 'a'){} //leggi fino ad 'a'

//a questo punto il prossimo carattere ottenuto con Serial.read(); sarà quello successivo ad 'a'

char buf;
int i = 0;
while((c = Serial.read()) != 'b'){ //fino a quando non arrivi a b
buf[i++] = c;
}

//ora in buf hai una stringa con il numero

Ovviamente è solo un'indicazione, se la comunicazione deve trasmettere molti dati (es. a123b234c123...) conviene usare altri mezzi per ridurre il codice e rendere tutto più flessibile, altrimenti ci vorrebbe un while per ogni dato

Ciao

G
[/quote]

Mmm però aspetta, il mio problema non sta nel comporre la stringa con i caratteri, ma nella ricezione dei caratteri stessi.
Io ho detto che nella stringa finale comparivano le "y" ma anche nel visualizzare i caratteri uno alla volta.
Non mi va il tuo codice (ovviamente li ho cambiato il "serial" con "my") ma anche se la logica di ricezione non è uguale a quella del codice che avevo postato un po' più sopra (tranne che per la "a" io ho messo un IF e tu un WHILE che non fa niente) ?

Correggimi se sbaglio :slight_smile:

EDIT: Ho provato a mettere un delay di 10 ms dentro al WHILE e le "y" sono diminuite notevolmente. Però, anche se lo porto a 100ms, ne rimane sempre una!
Sono disperato :~

le y potrebbero rappresentare un disturbo secondo te? li c'è da vedere chi invia i dati...

GWolf:
le y potrebbero rappresentare un disturbo secondo te? li c'è da vedere chi invia i dati...

Non un disturbo ma l'equivalente di "niente". Infatti se attendo un tot prima di leggere il char successivo le y diminuiscono. Ma una c'è sempre, anche se il delay lo porto a 100!
La stringa la invio o tramite DOS o tramite XCTU e la storia è sempre la stessa.. non so più cosa fare, sono rimasto fermo!

metti un semplice while e se il read ritorna 'y' continua a leggere, del tipo

char c;
while((c = serial.read()) == 'y'){}
//alla fine del while in c avrai il carattere "valido"

GWolf:
metti un semplice while e se il read ritorna 'y' continua a leggere, del tipo

L'ho detto, ci ho provato :slight_smile: solo che non è un carattere normale quindi può essere che sul monitor me lo stampa come y strana mentre invece è qualcos'altro.
Infatti chiedo se qualcuno sa come individuare questo carattere "null", in modo da filtrare come mi hai proposto. Non è un metodo perfettamente pulito ma mi potrebbe bastare perora

leggilo come valore esadecimale e vedi cosa esce