ciao ragazzi... sto provando a configurare in rete ethernet o in bus i2C arduino. nel primo caso lo collego al pc tramite cross, o al router al quale è anche connesso il pc, nel secondo caso invece ad un altra scheda arduino.
il problema che incontro però rimane sempre lo stesso: posso inviare delle parole al posto di caratteri singoli o numeri singoli?
Infatti se invio delle parole tramite Wire.write, posso vedere tramite monitor seriale che arrivano alla scheda ricevente, ma la stessa non è in grado di interpretarle... cioè, se invio un singolo carattere tipo "A" arriva e accende il classico led, invece se invio "accendi", pur ricevendo la parola non accende niente... come mai? ci sto provando da una settimana...
A naso, senza vedere il tuo codice, mi sa che non usi il confronto giusto fra le stringhe.
Il C non è Basic. In basic puoi fare
If val$="accendi" Then
non in C.
Se usi come stringa un array di char, e fai
if(arrchar=="accendi")
viene fatto il confronto fra puntatori a indirizzo alle zone di memoria di dove inizia il vettore e dove è memorizzato "accendi".
Se usi String, devi usare la funzione equals() apposita.
if( s.equals("accendi"))
dal manuale potresti fare if(s1==s2) ma credo che non puoi fare if(s1="accendi") perchè la parola tra doppi apici NON è un object String ma un vettore di caratteri.
Infatti l'errore è
char c = Wire.read();
Serial.print(c);
if (c=='Accendi ') // errore
{
c è dichiarata char, perciò può contenere solo un carattere.
Dal Wire la read ha letto un solo carattere, perciò non puoi confrontarlo con "Accendi",
al massimo puoi fare if(c=='A')
per poter usare un comando tipo "Accendi" devi leggere un tot di caratteri dal Wire e metterli in un vettore di char (char vet[10]; esempio) oppure in un oggetto String (esempio String str;)
ok... infatti per ora ho usato solo caratteri e funziona bene... vorrei però poter usare delle stringhe o dei cluster di char... ma la differenza quale sarebbe???? cioè un insieme di char (caratteri) viene chiamato cluster ma è sempre un insieme di caratteri? mentre una stringa è una parola intera o un numero con più cifre?
ora sto provando sia con la funzione string, che con il vettore di char... se avete altri consigli mi fate sapere???
grazie
cioè io ci sto provando, davvero, ma non ne cavo piede!
non riesco ad inviare una stringa e a riceverla dicendogli di accendere un led del cavolo... bo...
E' sbagliato. Intanto devi usare un tipo "byte" e poi in quel modo leggi solo 1 carattere alla volta.
nid69 ti aveva spiega come fare.
nid69ita:
per poter usare un comando tipo "Accendi" devi leggere un tot di caratteri dal Wire e metterli in un vettore di char (char vet[10]; esempio) oppure in un oggetto String (esempio String str;)
void loop()
{ char vcBuf[10]; // vettore di 10 caratteri (buffer)
int idx; // una variabile che conta quanti caratteri abbiamo inserito nel vettore
char c;
Wire.requestFrom(2, 8);
idx=0;
while(Wire.available())
{ c=Wire.read() // leggo un carattere
Serial.print(c);
vcBuf[idx]=c;
idx=idx+1; // o anche i++;
if(idx>=10) idx=0; // se vado oltre al buffer, riparto a riempire il buffer dall'inizio
if(strcmp(vcBuf,"Accendi")==0) // confronto vettori di caratteri usando funzione strcmp che internamente controlla char x char
{ digitalWrite(13, HIGH);
}
delay(500);
}
}
matt-korban:
ok... infatti per ora ho usato solo caratteri e funziona bene... vorrei però poter usare delle stringhe o dei cluster di char... ma la differenza quale sarebbe???? cioè un insieme di char (caratteri) viene chiamato cluster ma è sempre un insieme di caratteri? mentre una stringa è una parola intera o un numero con più cifre?
ora sto provando sia con la funzione string, che con il vettore di char... se avete altri consigli mi fate sapere???
grazie
cluser? intendi dire array forse...
bhe allora l'arry di char è la versione "grezza" del C, detta string con la s minuscola, la String invece è una classe, quindi arriva dal C++, ed è una string con in più delle funzioni per semplificare la vita aiprincipianti e far perdere meno tempo a scrivere sempre gli stessi pezzi di codice ai più esperti
si scusa, volevo dire array... intanto vi ringrazio per la vostra disponibilità... sopratutto nid69ita per il codice postato...
allora, mettendo insieme i vari pezzi e consigli che mi avete dato, sono giunto a questo codice, dove praticamente posso sia accendere e spegnere il led tramite i comandi "accendi" o "spegni".... l'unico problema è che devo resettare la scheda perchè si accorga del cambio di comando! infatti se cambio il comando senza resettarla non si accorge di niente e lo stato del led non cambia, pur cambiando comando nel serial monitor... sto provando a risolvere... qualche idea? basta resettare la stringa?
Logica: prova a metterti nei panni dei computer. Invii un comando e lo riconosce, perciò stringa="Accendi".
Come hai intuito, non azzeri la stringa perciò al prossimo carattere ricevuto, stringa sarà "Accendi"+altro carattere.
Non conosco bene classe String di Arduino. Credo che stringa="" dovrebbe azzerarla.
In linea generale poi sarebbe anche bene avere un contatore per evitare di aggiungere caratteri a stringa fino ad esaurire la memoria.
Se non mandi mai un comando valido, stringa diventerà sempre + grande fino ad esaurire la poca memoria di Arduino.
Se contatore>10 per esempio azzeri comunque la stringa.
Sei tu a stabilire le regole dei comandi tra chiamante e ricevente?
Se si, in linea generale, secondo me, sarebbe meglio usare un singolo carattere. 1 char = 255 comandi possibili.
Molto più pratico che non delle parole. A meno che non sia un umano a scrivere i comandi (per cui dovresti anche fare attenzione
alle maiuscole/minuscole)
ok adesso proverò a resettare le stringhe... provo proprio ora...
no, aspetta.... con un solo char posso inviare 255 valori diversi e quindi 255 comandi diversi???? ma dai....cioè allora nelle prove che avevo fatto devo aver sbagliato qualcosa!
appena provato con stringa=" "; ma niente... non cambia ancora di stato... vorrei fare anche il contatore come mi hai detto tu... poi magari ci provo. Deve contare i caratteri o cosa? perchè se metto if(stringa>10) non gli piace...
Si, naturalmente devi contare i caratteri. C'e' anche il comando length() per sapere la lunghezza di stringa.
if(stringa.length()>10) //allora azzero la stringa
Per azzerare la stringa, non sò come fare. Hai provato comunque a fare stringa="" e poi a stamparla sul monitor?
if (stringa=="accendi"){
digitalWrite(13, HIGH);
Serial.println(stringa); //stampa "accendi"
stringa="";
Serial.print(stringa);
Serial.println("***"); //non dovrebbe esserci nulla tra accendi e ***
}