AIUTO GSM SHIELD

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?

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

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

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

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

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

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

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

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

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