Go Down

Topic: AIUTO GSM SHIELD (Read 788 times) previous topic - next topic

maxvetro

Ciao a tutti sono alla presa con un rompicapo e dopo svariate ore di ricerca ho deciso di chiedere una mano :

Code: [Select]

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

Code: [Select]

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

lucadentella

Ciao

hai provato a stampare, carattere per carattere, il contenuto di smsbuffer e vedere cosa contiene?
lucadentella.it

m_ri

magari usa anche un carattere terminatore diverso dal 0..e poi mette il 0 da standard c

maxvetro

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

Code: [Select]
int len = strlen(smsbuffer);

mi dice che ne contiene 8 di caratteri

HELP!

vorrei semplicemente accendere un LED tramite un sms

pelletta

Il carattere che ti vede in più dovrebbe essere il terminatore di stringa \0
Prendi questa affermazione con le pinze però...

uwefed

confermo; una stringa termina con un zero per segnare la fine. Percui é di un carattere piú lunga.
Ciao Uwe

maxvetro

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

Code: [Select]


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

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..

maxvetro

Questo e ciò che stampa :


77
97
115
115
105
109
111
13

ho scritto Massimo

Nel frattempo ho risolto così :
Code: [Select]

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

"13" è il carattere di invio, \n. Quindi ha preso anche quello

m_ri

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



maxvetro

!! 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

Go Up