system
June 29, 2012, 6:29pm
1
Ciao a tutti sono alla presa con un rompicapo e dopo svariate ore di ricerca ho deciso di chiedere una mano :
void loop()
{
if(started){
//Read if there are messages on SIM card and print them.
if(gsm.readSMS(smsbuffer, 160, n, 20))
{
Serial.println(n);
Serial.println(smsbuffer);
int len = strlen(smsbuffer);
Serial.println(len);
if (strcmp( smsbuffer , "ciao") == 0) {
Serial.println("comando corretto");
} else {
Serial.println("comando errato");
}
}
delay(1000);
}
in pratica invio un SMS ma mi dice sempre comando errato .. ho inserito la riga
int len = strlen(smsbuffer);
Serial.println(len);
per vedere la lunghezza del messaggio che legge e se ad esempio scrivo un SMS con testo ciao lui mi dice che sono 5 caratteri e che errato
Grazie a tutti
Ciao
hai provato a stampare, carattere per carattere, il contenuto di smsbuffer e vedere cosa contiene?
m_ri
June 29, 2012, 7:07pm
3
magari usa anche un carattere terminatore diverso dal 0..e poi mette il 0 da standard c
system
June 29, 2012, 9:45pm
4
Ciao e grazie delle risposte..
Allora invio un messaggio con scritto MASSIMO e stampo lettera per lettera !
Lui mi stampa
M
A
S
S
I
M
O
quindi 7 caratteri...
ma la riga
int len = strlen(smsbuffer);
mi dice che ne contiene 8 di caratteri
HELP!
vorrei semplicemente accendere un LED tramite un sms
Il carattere che ti vede in più dovrebbe essere il terminatore di stringa \0
Prendi questa affermazione con le pinze però...
uwefed
June 29, 2012, 9:57pm
6
confermo; una stringa termina con un zero per segnare la fine. Percui é di un carattere piú lunga.
Ciao Uwe
system
June 29, 2012, 10:01pm
7
quindi ? quale condizione devo dargli per definire una condizione ?
Mi spiego meglio vorrei che se gli inviassi il messaggio LED1 accende il led 1 , se gli inviassi LED2 accende il led2
if (strcmp( smsbuffer , "LED1") == 0) {
Serial.println("acceso LED1");
}
if (strcmp( smsbuffer , "LED2") == 0) {
Serial.println("ACCESO LED2");
}
??? non va .. dove lo metto il terminator e 0 ?
grazie
m_ri
June 29, 2012, 11:08pm
8
ma di solito lo strlen ESCLUDE dal conteggio il terminatore di stringa 0..forse c'è qlk carattere non stampabile.. prova con
for(char *p=buffer;*p!=0;Serial.println((int)(*p)),p++);
e dicci cosa stampa..
system
June 30, 2012, 5:38am
9
Questo e ciò che stampa :
77
97
115
115
105
109
111
13
ho scritto Massimo
Nel frattempo ho risolto così :
if(smsbuffer[0]=='c' && smsbuffer[1]=='i' && smsbuffer[2]=='a' && smsbuffer[3]=='o') {
Serial.println("ok");
} else {
Serial.println("NO");
}
Quindi escludo il quinto carattere ma mi piacerebbe capire lo stesso il principio fi funzionamento
Grazie
leo72
June 30, 2012, 6:08am
10
"13" è il carattere di invio, \n. Quindi ha preso anche quello
m_ri
June 30, 2012, 8:25am
11
il modulo gsm usa come terminatore l'invio a capo..un modo 'banale'(e non bellissimo,xkè in alcuni casi potrebbe dare problemi) è quello di far girare questo codice prima del confronto
int indice;
for(indice=0;buffer[indice]!=0&&buffer[indice]!=13;indice++);
if(buffer[indice]==13)buffer[indice]=0;
in questo modo,ti scorri il buffer convertendo il terminatore di stringa usato dal gsm a quello usato dal c(e dall'arduino)..occhio nel caso una stringa contenga più risposte del GSM
system
June 30, 2012, 10:02am
12
!! ok !! ora ci lavoro un po sopra e vedo ... Lo stesso SHIELD lo usa FUTURA ELETTRONICA per un telecontrollo GSM ( che ho acquistato ) e i comandi li puoi mandare a caso... esempio
testo sms : "led1-on" --> accende il led1
testo sms : "led3-off" --> spegne il led3
testo sms : "led1-on led5_off temp1=22" --> accende il led1 , spegne il led5 , imposta il valore temperatura1 a 22 gradi !!
Quindi in qualche modo si può leggere il contenuto del messaggio !!!
Se dovessi aver news vi informo
Grazie come sempre della gentilezza