Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

GM862 ricezione sms

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] GM862 ricezione sms

Messaggioda Foto Utentelcua31989 » 29 dic 2016, 18:13

Buongiorno a tutti,

sono di nuovo qui per chiedere il vostro prezioso aiuto perché ormai non so più dove sbattere la testa :(

Ho un modulo telit GM862 con il quale ricevo le chiamate e gli sms sulla mia interfaccia, tutta programmata secondo la guida telit: https://www.sparkfun.com/datasheets/Cellular%20Modules/AT_Commands_Reference_Guide_r0.pdf
L'interfaccia, usata per gli SMS è la testuale.
Quando ricevo la chiamata, la seriale mi manda il messaggio RING e CLIP dove quest'ultimo contiene anche il nome di chi ha inviato il messaggio, perché il numero è salvato nella SIM. Purtroppo però questo non accade quando ricevo un messaggio. L'impostazione dei messaggi è la seguente:

Codice: Seleziona tutto
   AT+CMGF=1
   AT+CNMI=1,2,0,0,0
   AT+CSDH=0


A pagina 123 il manuale riporta: +CNMI - New Message Indications To Terminal Equipment dove i parametri sono: mode, mt, bm, ds e bfr. Come l'ho impostato io dovrei ottenere le seguenti modalità di funzionamento:

  • mode=1 --> Discard indication and reject new received message unsolicited result codes when TA-TE link is reserved, otherwise forward them directly to the TE.
  • mt=2 --> SMS-DELIVERs (except class 2 messages and messages in the message waiting indication group) are routed directly to the TE using the following unsolicited result code: +CMT:<oa>,<alpha>,<scts>[,<tooa>,<fo>,<pid>,<dcs>
  • bm=0 --> 0 Cell Broadcast Messages are not sent to the DTE
  • ds=0 --> Status report receiving is not reported to the DTE
  • bfr=0 --> TA buffer of unsolicited result codes defined within this command is flushed to the TE when <mode>=1..3 is entered (OK response shall be given before flushing the codes)

Con il parametro mt=2 dovrebbe rispondermi con il comando +CMT:<oa>,<alpha>,<scts>[,<tooa>,<fo>,<pid>,<dcs> mentre invece risponde sempre con il comando CMGR e i vari parametri.

Come posso fare a farmi rispondere con il comando CMT facendoli mettere anche il nome di chi ha inviato l'SMS se è presente in rubrica?

Grazie a tutti,
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[2] Re: GM862 ricezione sms

Messaggioda Foto Utentebiget » 29 dic 2016, 21:25

AT+CSDH=1
i messaggi comunque li puoi leggere con +CMGL e +CMGR
Avatar utente
Foto Utentebiget
1.155 3 7
CRU - Account cancellato su Richiesta utente
 
Messaggi: 464
Iscritto il: 16 dic 2016, 19:47

0
voti

[3] Re: GM862 ricezione sms

Messaggioda Foto Utentelcua31989 » 29 dic 2016, 23:13

Ciao,

ho provato a leggere con i due comandi che mi hai elencato, modificando il CSDH a 1 ma non funziona. Come mai c'è qualche altro parametro?
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[4] Re: GM862 ricezione sms

Messaggioda Foto UtenteWALTERmwp » 30 dic 2016, 0:21

Ciao @lcua31989
lcua31989 ha scritto:(...) Quando ricevo la chiamata, la seriale mi manda il messaggio RING e CLIP dove quest'ultimo contiene anche il nome di chi ha inviato il messaggio, perché il numero è salvato nella SIM. Purtroppo però questo non accade quando ricevo un messaggio (...)
non ho letto il documento del telit ma mi chiedo se hai predisposto la seriale (come la gestisci ? ) in modo adeguato all'acquisizione di tutto il messaggio.
A parte il nominativo, ricevi tutte le informazioni che ti aspetti ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: GM862 ricezione sms

Messaggioda Foto Utentelcua31989 » 30 dic 2016, 1:24

Ciao,

si, la seriale funziona correttamente, vedo tutti gli altri parametri ad esempio: riporto alcuni comandi che sto inviando per verificare alcune info:

Codice: Seleziona tutto
AT+GMI
> Telit Mobile Terminals

AT+GMM
> GM862-GSM - GSM900/1800 voice/data/fax module

AT+GMR
> 1.03.025 GM862-GSM

AT+GCAP
> +GCAP:+CGSM,+DS,+FCLASS,+MS

AT&V0

> DTE SPEED                      : 9600

>DTE FORMAT                     : 8N1

>GSM DATA MODE                  : Not Trasparent

>AUTOBAUD                       : +IPR0=YES           

>COMMAND ECHO                   : E1=YES           

>RESULT MESSAGES                : Q1=YES           

>VERBOSE MESSAGES               : V1=YES           

>EXTENDED MESSAGES              : X1=YES           

>LINE SPEED                     : F0=autodetect     

>CONSTANT DTE SPEED             : YES           

>FLOW CONTROL OPTIONS           : &K3=HW bidirect.   

>ERROR CORRECTION MODE          : RLP           

>CTS (C106) OPTIONS             : &B2=OFF while disc.

>DSR (C107) OPTIONS             : &S3=PHONE ready->ON

>DTR (C108) OPTIONS             : &D0=ignored       

>DCD (C109) OPTIONS             : &C1=follows carrier

>RI (C125) OPTIONS              : \R1=OFF dur. off-hk

>C108/1 OPERATION               : &D4=NO             

>POWER SAVING ON DTR            : +CFUN:1=NO             

>DEFAULT PROFILE                : &Y0=user profile 1


il segno > l'ho messo io per indentificare le risposte del modulo ti riporto un esempio di CMGR:

Codice: Seleziona tutto
  CMGR: "REC UNREAD","+3x3xx9864xxx",,"16/12/28,21:00:45+04",145,49,0,18,"+393492000200",145,


E' come se omettesse il parametro. Se vuoi sapere come gestisco la seriale ti posso dare alcune informazioni: baud rate = 9600 bps, alla ricezione di un carattere sulla seriale genero un interrupt che poi va a fare alcune operazioni di confronto. Posso postarti un pezzo di codice:

Codice: Seleziona tutto

void Interrupt()
{
     char buffer='\0';

     if(PIR1.RCIF) //interrupt di ricezione da seriale
     {
       buffer = Uart1_Read();
     
       if(buffer!=0x0D && buffer!=0x0A) //0x0D = \r; 0x0A = \n
         checked = checkString(buffer);

       if(checked>=RING && checked<=CHECK_SMS)
         status_device = checked;
     }
     PIR1.RCIF=0;
}


Codice: Seleziona tutto
void main()
{
   picSetup();
 
   while(1)
     ;
}

Codice: Seleziona tutto
unsigned short int checkString(char received)
{
   switch(gsm_buffer)
   {
     case 0:
     
          if(received=='O' || received=='E' || received=='R' ||
              received=='+') //OK, ERROR, RING, +
          {
            gsm_buffer=1;
          }
     break;
     
     case 1:
     
          gsm_buffer=0;
          if(received=='K')  //OK
          {
            return OK;
          }
          else if(received=='R' || received=='I' || received=='C') //ER, RI, C
               {
                 gsm_buffer = 2;
               }
     break;
     
     case 2:
     
          gsm_buffer=0;
          if(received=='R' || received=='N') //ERR, CR, RIN
          {
            gsm_buffer=3;
          }
          else if(received=='M')
               {
                 gsm_buffer=8;
               }

     break;
     
     case 3:
     
          gsm_buffer=0;
          if(received=='O' || received=='E' || received=='T') //ERRO, CRE, //CMT
          {
            gsm_buffer=4;
          }
          else if(received=='G') //RING
               {
                 return RING;
               }
     break;
     
     case 4:
          gsm_buffer=0;
          if(received=='R') //ERROR
          {
            return ERROR;
          }
          else if(received=='G') //+CREG
               {
                 gsm_buffer = 5;
               }
               else if(received=='I')
                    {
                      gsm_buffer = 7;
                    }
     break;
     
     case 5:
     
          gsm_buffer=0;
          if(received==':' || received==' ') //+CREG: (Waiting for first param)
            gsm_buffer=5;
          else if(received>='0' && received<='9') //CREG: n
               {
                  creg_mode = received-48;
                  gsm_buffer = 6;
               }
         
     break;
     
     case 6:
          gsm_buffer=0;
          if(received==',') //+CREG: n, (Waiting for second param)
            gsm_buffer=6;
          else if(received>='0' && received<='9') //CREG: n,n
               {
                  creg_status = received-48;
                  return OK;
               }

     break;
     
     case 7:
          gsm_buffer=0;
          if(received>='0' && received <='9')
          { 
            sms_index=received-48;
            return READ_SMS;
          }
          else
          {
            gsm_buffer=7;
          }
     break;
     
     case 8:
          gsm_buffer=0;
          if(received=='G') //CMG
          {
            gsm_buffer=9;
          }
          if(received=='T') //CMT
          {
            gsm_buffer=4;
          }
     break;
     
     case 9:
          gsm_buffer=0;
          if(received=='R') //CMGR
          {
            index_phonebook=0;
            gsm_buffer=10;
          }
     break;

     case 10: //processing CMGR command
         
          if(received==':' || received=='R' || received=='E' || received=='C' ||
             received=='U' || received=='N' || received=='R' || received=='E' ||
             received=='A' || received=='D' || received==' ' || received=='"')
          {
             gsm_buffer=10;
          }
          else if(received==',')
               {
                 count_comma+=1;
                 if(count_comma==11)
                 {
                   gsm_buffer=11; //sms parameeters are done
                   index_phonebook=0;
                   }
                 else
                   gsm_buffer=10;
               }
               else if(((received>='0' && received<='9') || received=='+')
                        && count_comma==1)
              {


                gsm_buffer=10;

                  phone_number[index_phonebook] = received;
                 
                index_phonebook+=1;
                received='\0';
              }
             

     break;
     
     case 11: //sms body
             ;
             if(index_phonebook<160)
             {
               sms_txt[index_phonebook] = received;
               index_phonebook+=1;
               gsm_buffer=11;
             }
           
            if(received=='O')
                    gsm_buffer=12;
            else
                    index_phonebook=0;
      break;
     
      case 12:

           gsm_buffer=0;
           if(received=='K')
           {
             PROCESS_LED=0;
             return CHECK_SMS;
           }
           else
             gsm_buffer=11;
      break;
   }
   
   return ERROR;
}

Codice: Seleziona tutto
void picSetup()
{         //da rivedere


         char *command[]={ "AT+ATE=0", "AT#MONI=1", "AT+CLIP=1",
                      "AT+CMGF=1", "AT+CSDH=1", "AT+CPMS=SM", "",
                      "AT+CNMI=2,2,0,0"};//"AT+CNMI=2,1,0,0" };};//"AT+CNMI=2,1,0,0" };
       
     OSCCON = 0b11110010;
     
     APFCON0 = 0B01000010;
     APFCON1 = 0B00000000;
     
     OPTION_REG =0B11000000;
     
     TRISA = 0B00100001;
     WPUA = 0B00000000;
     ANSELA = 0B00000001;
     LATA = 0B00000000;

     TRISB = 0B11111010;
     WPUB = 0B00000000;
     ANSELB = 0B00000000;
     LATB = 0B00000000;
     
     DACCON0 = 0B00000000;
     DACCON1 = 0B00000000;
     CM1CON0=0B00000000;
     CM1CON1=0B00000000;
     CM2CON0=0B00000000;
     CM2CON1=0B00000000;
     CMOUT = 0B00000000;
     
     ADCON0 = 0B10000001;
     ADCON1 = 0B10000000;

     INTCON = 0B11001000;
     IOCBP = 0B00110000;
     PIE1.RCIE=1;
     PIR1.RCIF=0;
     PIE1.TXIE=0;

     ADC_Init();
     UartInit();
   

     TurnOnGM862(); //Accendi il gsm

     gm862Init(command, 8);

    do
     {
       ;
     }
     while(moduleIsRegistrated()!=1);
     creg_status=0;

     deleteSMS(); //elimino tutti i messaggi in memoria



     Delay_ms(5000);
}


Credo che se riesco a ricevere tutti parametri la seriale dovrebbe essere OK. Io credo che il modulo non abbia alcune configurazioni. Tu cosa dici?

Grazie
Lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[6] Re: GM862 ricezione sms

Messaggioda Foto UtenteWALTERmwp » 30 dic 2016, 1:53

lcua31989 ha scritto:(...) Tu cosa dici? (...)
è molto probabile che la questione sia da confinare al telit, eventualmente alla impostazione di qualche parametro.

Al momento mi sento di suggerire questo, ma può darsi tu ci abbia già pensato: la lettura che esegui è relativa ad un messaggio appena ricevuto (infatti è un REC UNREAD) ma per indagare puoi reiterare la richiesta di quello senza spedirne altri e senza utilizzare il micorocontrollore (presupponendo assenza di problemi da quel lato).

Usa una connessione seriale da un PC ed un programma tipo hyperterminal per verificare/modificare i parametri del modem e richiedergli uno dei messaggi (sono numerati in progressione, come avrai visto) che ha già in memoria.
Bisogna quindi riguardare i parametri (ri-scrivo, non ho letto la documentazione) e se si esclude un baco nella possibilità di farsi restituire il nominativo allora è più facile sia sfuggito qualche particolare.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[7] Re: GM862 ricezione sms

Messaggioda Foto Utentelcua31989 » 30 dic 2016, 2:08

Ciao,

effettivamenti sì non sono stato poi così chiaro nella spiegazione, ovvero il dialogo avviene solo da microcontrollore a modulo. In mezzo c'è un convertitore seriale USB con adattatore di livello MAX232 per intercettare i messaggi di dialogo tra i due. Con un hiperterminal seriale riesco a vedere tutto. L'unica cosa che mi viene in mente è che i messaggi siano di classe 2 come riportato nel manuale, ma sinceramente non so cosa voglia dire. Vedi pagina 123 paragrafo 3.5.3.3.1

Grazie mille per l'aiuto
ciao
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti