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:
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?
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
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
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?
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
#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
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
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 :~
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!
GWolf:
metti un semplice while e se il read ritorna 'y' continua a leggere, del tipo
L'ho detto, ci ho provato 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