Shield GSM, legge sempre l'ultimo sms

Buongiorno ragazzi,
sto cercando di leggere da una shield gsm con modulo sim900 un sms,
riesco anche a leggerlo ma ho difficoltà in quanto leggo sempre lo stesso, fintanto che non ricarico il codice.
Ora vorrei fare debug leggendo i valori che mi tornano dalle funzioni della libreria.
In questo modo posso capire perchè leggo sempre lo stesso sms.
Le funzioni restituiscono un Char, ma io non riesco in nessun modo a stamparmi questo char nel monitor seriale.

Inoltre se conoscete uno snippet di codice che è ottimo per la gestione degli sms vi prego di linkarmelo, almeno da li mi rendo conto degli errori

Anche se non ho mai usato sms e cose simili (comunicazione per me è solo seriale) temo due cose:
La prima è che se non riesci a stampare una char ritornata da una funzione… è solo perché la funzione non ritorna una char. Infatti alle varie funzioni di print non interessa che storia abbia quello che printano, basta che esista.
In secondo luogo temo sia impossibile aiutare senza le seguenti informazioni:
1)Cosa vuoi fare?
2)Con quali componenti? (datasheet)
3)E con quale codice?
Privi di queste informazioni tutto quello che ti possiamo dire sono solo supposizioni nate sul nulla.

Silente:
... senza le seguenti informazioni:
1)Cosa vuoi fare?
2)Con quali componenti? (datasheet)

Silente ...
... ma hai letto bene il suo quesito ? ? ? :o :o :o

Vuole leggere gli SMS e lo vuole fare tramite un SIM900 ...
... al limite, l'unica informazione che manca è ... che libreria sta usando (visto che ce ne sono in giro parecchie), NON certo cosa vuole fare e con quale componente !!!

Guglielmo

>costaxs: mai usato librerie per quel tipo di richieste ai moduli SIM ...
... la gestione degli SMS è piuttosto semplice da fare con i comandi AT senza andarsi a portare dietro una libreria che fa decine e decine di altre cose (... sicuramente utili in caso di cose più complesse, come il GPRS ed il TCP/IP).

In ogni caso dovreti studiarti la libreria e vedere:

  1. se hai una funzione che ti ritorna il NUMERO DI SMS ricevuti

  2. se hai una funzione che ti permette di LEGGERE IL SINGOLO SMS tramite l'indice (ovvero un unmero da 1 a N a secondo di quanti SMS hai ricevuto)

  3. se hai una funzione che ti permette di CANCELLARE UN SMS tramite l'indice

Sono tutte cose piuttosto facili da fare con i comandi AT e sono quasi certo che qualsiasi libreria le implementi.

Guglielmo

La libreria che utilizzo è la GSMSHIELD, GitHub - MarcoMartines/GSM-GPRS-GPS-Shield: GSM/GPRS & GPS Shield Library for modules using SIM900/SIM908

Questo è il mio codice, come vedete sono riuscito a leggere il valore di ritorno della funzione isSMSPresent, ma ottengo sempre 0 dopo il primo sms.

Cioè, arriva il primo sms, isSMSPresent Risponde 1 e mi stampa l’sms

Mando quindi un secondo sms ma isSMSPresent Risponde sempre 0 e non leggo il secondo sms ricevuto dal modulo gsm.

Sto impazzendo ehehe

#include "SIM900.h"
#include <SoftwareSerial.h> // necessaria alla libreria gsm.h richiamata in sms.h
// #include "inetGSM.h"     // necessaria per l'uso di HTTP
#include "sms.h"            // Libreria per la gestione degli SMS

SMSGSM sms;
int rele = 12; // Il Pin 12 è quello connesso al relè
int numdata;
boolean started=false;

char number[20];
char message[180];
char pos;
char *p;

void setup() 
{
  Serial.begin(9600);
  Serial.println("ESEMPIO INVIO/RICEZIONE SMS");
    // Inizializzo la connessione GSM impostando il baudrate
  if ( gsm.begin(2400) )
  {
     Serial.println("STATUS Modulo GSM = PRONTO");
     started=true;  
  }
  else 
     Serial.println("STATUS Modulo GSM = INATTIVO");
};


void loop() 
{
   if (started)
  {
       pos=sms.IsSMSPresent(SMS_UNREAD);  //save to variable if there is an SMS
       Serial.println((int)pos);          //display position number (a.k.a index) of the message
       if((int)pos>0&&(int)pos<=20)       //if message from 0-20 is found
              {                   
               Serial.print("Message Received, INBOX=");  //display an output on the serial monitor
               Serial.println((int)pos);                  //display the position/index of the message
               message[0]='\0';                           //display '0' if no messages found
               sms.GetSMS((int)pos,number,message,180);   //get position/index, number of sender, and text message
               Serial.println(message);                   //display the text on serial monitor
               sms.DeleteSMS((int)pos);                          //after reading, delete SMS
                }
        delay(5000);                        
    
  }
};

A QUESTO link hai il manuale del set di comandi AT del SIM900 ... guarda il cap. 4 da pagina 97 in poi ... vedrai i vari comandi AT che si possono inviare per gli SMS e l'effetto che hanno. Da questo dovrebbe essere facile cercare di trovare delle funzioni simili nella libreria che usi.

Guglielmo

Edit: In QUESTO file della libreria che stai usando, ci sono elencate le funzioni che hai a disposizione ... come vedi rispecchiano, più o meno, quello che ti indicavo come comandi AT.

Ottimo, Grazie mille Guglielmo, farò cosi come mi suggerisci, grazie mille.

Ho tentato con gli AT command, ma li trovo ancora un pò complessi per me.
Sono tornato all'uso della libreria. ma quel che accade è sempre la stessa cosa.
Legge il primo sms, e poi non legge i successivi.
Qualche anima pia che ha avuto lo stesso problema?

La libreria è corredata di un esempio per la lettura degli SMS ... fai girare quello SENZA modificarlo e vedi se funziona, dopo di che, se funziona, usalo come spunto di partenza.

Guglielmo

Gentilissimi, sto cercando di ricevere sms con una shield di questo tipo:

e questa la libreria:

ho cercato di lasciar perdere la libreria e di provare l’utilizzo degli AT command ma credo di poter riconoscere onestamente che non sono all’altezza.

Sono tornato all’uso della libreria, ma ancora ho il problema di prima cioè Ricevo il primo sms ma non il secondo.

Mi farebbe davvero piacere se deste uno sguardo al mio codice e alla libreria che sto usando.
Dubito che la libreria sia sbagliata perchè è molto usata in rete e a quanto pare nessuno ha questo mio problema.

In pratica la funzione isSMSPresent(SMS_UNREAD) mi torna 0 anche quando la sim dovrebbe aver ricevuto il “Secondo SMS”

La cosa strana è che il primo sms lo ricevo correttamente, da quel momento, questa funzione torna il valore 0 non trovando la presenza di un altro “sms non letto” da mostrare.

Ti ringrazio infinitamente per il vostro aiuto sempre prezioso.

Questo il codice

#include "SIM900.h"
#include <SoftwareSerial.h>
//If not used, is better to exclude the HTTP library,
//for RAM saving.
//If your sketch reboots itself proprably you have finished,
//your memory available.
//#include "inetGSM.h"

//If you want to use the Arduino functions to manage SMS, uncomment the lines below.
#include "sms.h"
SMSGSM sms;

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to send and receive SMS.

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char sms_position;
char phone_number[20];
char sms_text[100];
int i;

void setup()
{
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");
    if(started) 
    {
      for (i=1;i<=20;i++)
      {
        sms.DeleteSMS(i);
      }
       
    }
    
};

void loop()
{
     if(started) {
         sms_position=sms.IsSMSPresent(SMS_UNREAD); // SMS.cpp Method finds out if there is present at least one SMS with specified status
        Serial.print("SMS postion:");
        Serial.println(sms_position,DEC);
        
        if (sms_position) 
        {
            Serial.print("SMS postion:");
            Serial.println(sms_position,DEC);
            sms.GetSMS(sms_position, phone_number, 11, sms_text, 100); //Arguments to GET SMS. See SMS.h line12:(byte position, char *phone_number,byte max_phone_len, char *SMS_text, byte max_SMS_len)
            Serial.println(phone_number);
            Serial.println(sms_text);
            sms.DeleteSMS(sms_position);
        }      
        delay(5000);
     }
};

Libreria:

*********************************************************/
char SMSGSM::IsSMSPresent(byte required_status)
{
     char ret_val = -1;
     char *p_char;
     byte status;

     if (CLS_FREE != gsm.GetCommLineStatus()) return (ret_val);
     gsm.SetCommLineStatus(CLS_ATCMD);
     ret_val = 0; // still not present

     switch (required_status) {
     case SMS_UNREAD:
          gsm.SimpleWriteln(F("AT+CMGL=\"REC UNREAD\""));
          break;
     case SMS_READ:
          gsm.SimpleWriteln(F("AT+CMGL=\"REC READ\""));
          break;
     case SMS_ALL:
          gsm.SimpleWriteln(F("AT+CMGL=\"ALL\""));
          break;
     }

     // 5 sec. for initial comm tmout
     // and max. 1500 msec. for inter character timeout
     gsm.RxInit(5000, 1500);
     // wait response is finished
     do {
          if (gsm.IsStringReceived("OK")) {
               // perfect - we have some response, but what:

               // there is either NO SMS:
               // <CR><LF>OK<CR><LF>

               // or there is at least 1 SMS
               // +CMGL: <index>,<stat>,<oa/da>,,[,<tooa/toda>,<length>]
               // <CR><LF> <data> <CR><LF>OK<CR><LF>
               status = RX_FINISHED;
               break; // so finish receiving immediately and let's go to
               // to check response
          }
          status = gsm.IsRxFinished();
     } while (status == RX_NOT_FINISHED);




     switch (status) {
     case RX_TMOUT_ERR:
          // response was not received in specific time
          ret_val = -2;
          break;

     case RX_FINISHED:
          // something was received but what was received?
          // ---------------------------------------------
          if(gsm.IsStringReceived("+CMGL:")) {
               // there is some SMS with status => get its position
               // response is:
               // +CMGL: <index>,<stat>,<oa/da>,,[,<tooa/toda>,<length>]
               // <CR><LF> <data> <CR><LF>OK<CR><LF>
               p_char = strchr((char *)gsm.comm_buf,':');
               if (p_char != NULL) {
                    ret_val = atoi(p_char+1);
               }
          } else {
               // other response like OK or ERROR
               ret_val = 0;
          }

          // here we have gsm.WaitResp() just for generation tmout 20msec. in case OK was detected
          // not due to receiving
          gsm.WaitResp(20, 20);
          break;
     }

     gsm.SetCommLineStatus(CLS_FREE);
     return (ret_val);
}

>costaxs: Ti ricordo che in conformità al REGOLAMENTO della sezione Italiana del Forum, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui NON puoi aprire un'altro thread sullo stesso argomento.

Ho quindi riunito io i tuoi due thread e ti prego di continuare qui senza aprire altri thread, in altre sezioni, per il tuo problema di SMS. Grazie.

Guglielmo

P.S.: Inoltre al post #8 ti ho anche detto di fare alcune prove e di dirci i risultati ... stiamo sempre aspettando ... ::slight_smile:

Perdonatemi ! Ho fatto la prova utilizzando l'esempio della libreria senza modificarlo. Succede la stessa identica cosa, cioè ricevo solo il primo sms e non i successivi.

Questo è strano ...
... o la libreria ha un problema (ed allora prova a cercare un'altra libreria che supporti i moduli SIM) o ... quel modulo ha qualche problema ... ma per esserne sicuri dovresti saper utilizzare i comandi AT e fare le varie prove con essi ... ::slight_smile:

Guglielmo

Ok, provo a cercare qualche libreria, per gli AT command non riesco a trovare un esempio di codice da cui partire, sapete consigliarmi qualcosa a riguardo?

Basta che apri qualsiasi libreria e dietro, quelle che tu vedi come funzioni da richiamare, in realtà altro non trovi che l'invio di una seria di comandi AT, dato che quei moduli ... così funzionano :wink:

Guglielmo

Giusto, ma le librerie sono in c, invece io vorrei un esempio per inviare gli at command direttamente dal codice dello sketch.

costaxs:
Giusto, ma le librerie sono in c, invece io vorrei un esempio per inviare gli at command direttamente dal codice dello sketch.

:o :o :o … perché tu i programmi in cosa li scrivi ? ? ?

Guglielmo

Argh !! Giusto !! Che figuraccia !! eheheh