Salve a tutti, sto facendo degli esperimenti con dei moduli TX/rx rf433Mhz.
Sto trasmettendo due stringhe "X1234" e "X4321"
questo è il codice:
#include <SoftwareSerial.h>
int car[3] ;
int carattere;
void setup(){
Serial.begin(2400);
}
void loop(){
riprova:
for (int i = 0; i < 4; i++) {
car[i] = 0;
}
if (Serial.available()){
if (char(Serial.read()) != 'X'){
goto riprova;
}
if (char(Serial.read()) != '1'){
goto riprova;
}
car[0] = Serial.read(); // Then: Get them.
car[1] = Serial.read(); // Then: Get them.
car[2] = Serial.read(); // Then: Get them.
Serial.print(char(car[0]));
Serial.print(char(car[1]));
Serial.println(char(car[2]));
}
}
Se cancello la seconda if tutto funziona, se la mantengo non funziona.
Ho provato con una funzione, ad associare ad un'altra variabile, ma niente.... avete qualche suggerimento???
Saluti e grazie Jimi Dini
da ignorante.. Perchè verifichi la diversità rispetto ad '1'? Diverso da x lo capisco.. Poi, non ti conviene svuotare il buffer nel caso le condizioni non siano vere? Perchè altrimenti ti tocca leggere tutta la stringa e poi ricomincia.. Credo!
A parte l'uso dei goto, che mi crea scompensi ormonali
Se verifichi l'esistenza di "1" e non di "4" dovrebbe passare solo al prima delle 2 stringhe che ti servono.
Sempre che una delle X1234 o X4321 passi
rubino25:
da ignorante.. Perchè verifichi la diversità rispetto ad '1'? Diverso da x lo capisco.. Poi, non ti conviene svuotare il buffer nel caso le condizioni non siano vere? Perchè altrimenti ti tocca leggere tutta la stringa e poi ricomincia.. Credo!
mi serve come discriminante per una funzione futura, del tipo se arriva 1 fai questo, se arriva 2 etc... al momento la trasmissione è fissa per pura comodità...
Perchè dici che devo leggere tutta la stringa??? in realtà io vedo se il primo carattere è "x" e vado avanti altrimenti ricomincio subito con la lettura, poi identifico il secondo carattere e se è corretto proseguo con la lettura altrimenti ricomincio...
leggo tutto solo se le prime due condizioni sono valide...
saluti e grazie Jimi Dini
A parte l'uso dei goto, che mi crea scompensi ormonali ;)
Se verifichi l'esistenza di "1" e non di "4" dovrebbe passare solo al prima delle 2 stringhe che ti servono.
Sempre che una delle X1234 o X4321 passi ;)
In realtà la X mi serve per identificare l'inizio del comando, il secondo carattere il gruppo, e gli ultimi tre un valore...
la cosa che non capisco, è perchè non funzionano insieme, ho anche provato a fare la if solo sul secondo carattere, e funziona, ma se metto entrambe le if non fa niente...
Grazie e saluti Jimi Dini
Hai capito perfettamente e ti ringrazio molto.... ma.... non funziona... stesso problema di prima, se tolgo il secondo giro, per intenderci il commandgroup, funziona tutto bene, se lo lascio non fa niente...
Grazie mille e saluti Jimi Dini
Al momento i caratteri non vengono letti bene, ma quello non è un gran problema è solo la conversione in ascii, non mi preoccupa molto.
Sulla console seriale, se togli la if della commandgroup funziona tutto e si vedono i caratteri, se la lasci... non si vede nulla...
Non riesco a spiegarmi questa cosa... in fondo sono due if... ho cercato anche di leggere i primi due caratteri e fare il confronto con le due if congiungendole con && ma niente.. sembra quasi che non accetti una doppia if, ma mi sembra veramente assurdo..
Ho pensato anche che la scrittura sulla seriale potesse creare problemi alla lettura dal modulo radio ed ho messo un led di test giusto per vedere se l'esecuzione arrivava fino alla lettura degli ultimi tre caratteri... ma niente...
Grazie e saluti Jimi dini
Stilgar:
Fatti stampare a console cosa legge la seconda volta
in che senso??? la stampa della lettura con entrambe le if è nulla, non si accende neanche il led sulla scheda per la ricezione. Se invece ne tolgo una si accende il led e sulla console appaiono i caratteri...
Grazie e saluti Jimi Dini
Stilgar:
Così vedi il codice numerico del carattere, senza che venga interpretato dalla console
Dopo aver provato e provato più volte sono finalmente riuscito a farlo funzionare... il codice è il tuo, l'unica differenza è sull'available invece che chiedere true/false ho impostato > 4.
Tanti saluti e grazie mille per l'aiuto.
Jimi Dini
leo72:
Il check dovrebbe essere Serial.available()>0 perché basta infatti verificare che ci sia qualche carattere disponibile.
deve essere >4, altrimenti se ci sono meno di 4 caratteri, una o più delle read ritorna -1 (nessun carattere disponibile nel buffer), e -1 nella tabella ascii...
lesto:
deve essere >4, altrimenti se ci sono meno di 4 caratteri, una o più delle read ritorna -1 (nessun carattere disponibile nel buffer), e -1 nella tabella ascii...
Giustissimo...
Grazie per la precisazione.
Saluti Jimi Dini
hihi
-1 nella tabella ascii diventa 0xFF, quindi (a seconda del Code Page, avendo superato il 127esimo carattere) hai un carattere "speciale"
Credo un secondo "spazio" in quasi tutte le tabelle
Sai che casino poi XD