Lib SIM5320 avec SMS

Dependents:   0-sim5320e-L432KC-relais-0

Files at this revision

API Documentation at this revision

Comitter:
schnf30
Date:
Wed May 18 08:09:18 2022 +0000
Parent:
0:d63231e47571
Commit message:
SIm5320 et SMS avec exemple

Changed in this revision

sim5320e.cpp Show annotated file Show diff for this revision Revisions of this file
sim5320e.h Show annotated file Show diff for this revision Revisions of this file
sim800l.cpp Show diff for this revision Revisions of this file
sim800l.h Show diff for this revision Revisions of this file
diff -r d63231e47571 -r 8eff8b2b35e8 sim5320e.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim5320e.cpp	Wed May 18 08:09:18 2022 +0000
@@ -0,0 +1,206 @@
+
+#include "mbed.h"
+#include "sim5320e.h"
+/*
+char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception
+char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
+char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
+c // pour convertir en phrase avant envoi
+*/
+sim5320e::sim5320e(PinName tx, PinName rx, PinName resetpin,int baudrate):serial(tx,rx), reset (resetpin)
+{
+    reset.write(0);  //reset
+    /*    _DataTmp = new char[maxdata + 1]; // tableau de donnees pour stocker pendant reception
+        _Data = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
+        _DataSms = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
+        */
+    _DataTmp[0] = 0;
+    _Data[0] = 0;
+    _DataPtr = 0;
+    _DataReady = false;
+    _SmsReady = false;
+    _IndexSms = 0;
+    serial.baud(baudrate);  // configure data baud
+}
+// retourne incdex du sms recu
+int sim5320e::IndexSmsRecu(void)
+{
+    return _IndexSms;
+}
+// return true si une phrase a ete recue
+bool sim5320e::dataready(void)
+{
+    return _DataReady;
+}
+// return phrase recu
+char * sim5320e::read(void)
+{
+    _DataReady = false;
+    return _Data;
+}
+// recoit les caractere serie et les stocke en tache de fond
+void sim5320e::receive()
+{
+    char inChar;
+    if (serial.readable()) {
+        inChar = serial.getc();
+//        pc.putc(inChar);  // pour echo
+        switch (inChar) {
+            case '\n' :
+                if (_DataPtr > 1) {
+//                    pc.printf("-%s/\r\n",_DataTmp);
+                    if (strncmp(_DataTmp,"+CMTI:",6)==NULL) { // recoit sms +CMTI: "SM",3
+                        if (sscanf(_DataTmp,"+CMTI: \"SM\",%d",&_IndexSms)==1) _SmsReady = true;
+                    } else {  // cmde
+                        strcpy(_Data,_DataTmp);
+                        _DataReady = true;
+                    }
+                }
+                _DataTmp[0] = 0;
+                _DataPtr = 0;
+                break;
+            case 0 :
+                break;
+            case '\r' :
+                break;
+            case ' ' :
+                if (_DataPtr==1) {
+                    if ( _DataTmp[0]=='>') {
+                        strcpy(_Data,_DataTmp);
+                        _DataReady = true;
+                        _DataTmp[0] = 0;
+                        _DataPtr = 0;
+                        break;
+                    }
+                }
+            default :
+                _DataTmp[_DataPtr] = inChar;
+                _DataPtr = _DataPtr + 1;
+                _DataTmp[_DataPtr] = 0;
+        }
+        if (_DataPtr >= maxdata) {  // si phrase trop longue vide phrase
+            _DataTmp[0] = 0;
+            _DataPtr = 0;
+        }
+    }
+}
+// fonction appele en fin timerout
+void sim5320e::Ftimeout()
+{
+    FinTimeOut = true;
+}
+// defini time out et le lance
+void sim5320e::SetTimeout(float delay)
+{
+    FinTimeOut = false;
+    _timeout.attach(callback(this,&sim5320e::Ftimeout),delay);
+}
+// attente reponse dans *reponse jusqua timeout
+bool sim5320e::waitreponse(const char *reponse,float timeout)
+{
+    SetTimeout(timeout);
+    while (FinTimeOut==false) { // attente Ok
+        if (dataready()) {
+            char tmp[maxdata + 1];
+            strcpy(tmp,read());
+            if (strcmp(tmp,reponse)==0) return true;
+            if (strcmp(tmp,"ERROR")==0) return false;
+        }
+    }
+    return false; // timeout ecoule donc erreur
+}
+// envoi commande et attend reponse
+bool sim5320e::writecmdandwaitreponse(const char *data, const char *reponse,float timeout)
+{
+    serial.printf("%s\r\n",data);
+    return waitreponse(reponse,timeout);
+}
+// initialise sim5320e en mode SMS Texte
+// configure baud
+// Renvoi
+// - true tout s'est bien passé
+// - false erreur
+// cmdecho = true --> copie donne de reponse sim5320e vers pc
+bool sim5320e::init()
+{
+    bool resultat = true;
+    _DataTmp[0] = 0;
+    _Data[0] = 0;
+    _DataPtr = 0;
+    _DataReady = false;
+    _SmsReady = false;
+    _IndexSms = 0;
+    reset.write(0);  //reset
+    thread_sleep_for(100);
+    reset.write(1);
+    thread_sleep_for(1000);
+    serial.attach(callback(this, &sim5320e::receive), RawSerial::RxIrq); // affecte interruption sur Rx
+    int i=0;
+    while (!writecmdandwaitreponse("AT","START",timeoutdefaut)) { // on attend 10 x pas plus
+        if (i++>10) return false;
+    }
+    if (!waitreponse("+CPIN: READY",timewaitCallready)) return false;
+    if (!waitreponse("SMS DONE",timewaitCallready)) return false;
+    return waitreponse("PB DONE",timewaitCallready);
+}
+
+// initialise mode sms
+bool sim5320e::smsinit(void)
+{
+    if (!writecmdandwaitreponse("AT+CMGF=1","OK",timeoutdefaut)) return false;  // sms mode texte
+    if (!writecmdandwaitreponse("AT+CNMI=2,1","OK",timeoutdefaut)) return false;  // tretourne tout te
+    if (!writecmdandwaitreponse("AT+CSDH=1","OK",timeoutdefaut)) return false;
+    return writecmdandwaitreponse(" AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",timeoutdefaut);;
+}
+// efface tous les message
+bool sim5320e::smsclearall(void)
+{
+    return writecmdandwaitreponse("AT+CMGD=1,4","OK",timewaitSmsallclear);  // efface sms
+
+}
+bool sim5320e::smsready(void)
+{
+    bool _SmsReadytemp = _SmsReady;
+    _SmsReady = false;
+    return _SmsReadytemp;
+}
+bool sim5320e::sendsms(const char *phonenumber,const char *data)
+{
+    if (!writecmdandwaitreponse("AT+CMGF=1","OK",timeoutdefaut)) return false;  // Passe sms mode texte
+    char _Phrase[maxdata + 1];
+    sprintf(_Phrase,"AT+CMGS=\"%s\"",phonenumber);
+    if (!writecmdandwaitreponse(_Phrase,">",timeoutdefaut)) return false;  // ouvre sms
+    sprintf(_Phrase,"%s%c",data,26);
+    return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message
+}
+// Lecture sms jusqua reception reponse dans *reponse
+bool sim5320e::waitsmsreponse(const char *reponse,float timeout)
+{
+    char DataSmsOk = 0;
+    _DataSms[0] = 0;
+    SetTimeout(timeout);
+    while (FinTimeOut==false) { // attente Ok
+        if (dataready()) {
+//           pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
+            if (strcmp(read(),reponse)==0) return true;  // sms termine cest tout bon
+            if (strncmp(read(),"+CMS ERROR",9)==0) return false;  // sms termine cest tout bon
+            if (strncmp(read(),"+CMGR:",6)==NULL) DataSmsOk = 1;
+            else if (DataSmsOk!=0) {
+                if (DataSmsOk > 1)  strcat(_DataSms,",");
+                strcat(_DataSms,_Data);
+                DataSmsOk = 2;
+            }
+//            pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
+        }
+    }
+    return false; // timeout ecoule donc erreur
+}
+char *sim5320e::readtextesms()
+{
+    return _DataSms;
+}
+bool sim5320e::readsms(int index)
+{
+    serial.printf("AT+CMGR=%d\r\n",index);
+    return waitsmsreponse("OK",timeoutreadsms);
+}
\ No newline at end of file
diff -r d63231e47571 -r 8eff8b2b35e8 sim5320e.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim5320e.h	Wed May 18 08:09:18 2022 +0000
@@ -0,0 +1,70 @@
+#ifndef _sim5320e_
+#define _sim5320e_
+#include "mbed.h"
+#include "MySerial.h"
+#ifndef maxdata
+#define maxdata 99   // taille des phrasers de dialogues.
+#endif
+#define timeoutdefaut 1
+#define timeoutsendsms 60
+#define timeoutreadsms 5
+#define timewaitCallready 10
+#define timewaitSmsready 60
+#define timewaitSmsallclear 25
+#define timewaitCCID 2
+
+extern MySerial pc;
+
+class sim5320e
+{
+public:
+    /*
+    * Constructor
+    *
+    * @param tx mbed pin to use for tx line of Serial interface
+    * @param rx mbed pin to use for rx line of Serial interface
+    * @param reset reset pin of the wifi module ()
+    */
+    sim5320e(PinName tx, PinName rx, PinName resetpin, int baudrate=9600);
+    bool init();
+    bool smsinit(void);
+    bool smsready(void);
+    bool sendsms(const char *phonenumber,const char *data);
+    bool readsms(int index);
+    bool smsclearall(void);
+    int IndexSmsRecu(void);
+    char *readtextesms();
+
+protected:
+    RawSerial serial;
+    DigitalOut reset;
+    /*    char *_DataTmp; // tableau de donnees pour stocker pendant reception
+        char *_Data; // tableau de donnees lorsque toutes les donnees sont recues
+        char *_DataSms; // tableau de donnees lorsque toutes les donnees sont recues
+        char *_Phrase; // pour convertir en phrase avant envoi
+        */
+
+    char _DataTmp[maxdata + 1]; // stocker pendant reception sur rxd en evenement
+    char _Data[maxdata + 1]; // stocke les donnees lorsqu'une phrase complete est recu 
+    char _DataSms[maxdata + 1]; // stocke donnee lorsquun sms est recu
+
+    volatile int _DataPtr = 0; // position de stockage de la prochaine donnee a recevoir
+    volatile bool _DataReady = false;  // des donnees complete ont ete recus
+    volatile bool _SmsReady = false;  // un sms est recu
+    volatile int _IndexSms;   // contient lindex du sms
+    Timeout _timeout; // permet deviter blocage en attente
+    volatile bool FinTimeOut;  // 
+    
+    bool dataready(void);  // renvoi letat xe _dataready
+    char * read(void);
+    void receive();
+    void Ftimeout();
+    void SetTimeout(float delay);
+// attente r eponse dans *reponse
+    bool waitreponse(const char *reponse,float timeout);
+// envoi commande et attend reponse
+    bool writecmdandwaitreponse(const char *data, const char *reponse,float timeout);
+// attente reponse dans *reponse
+    bool waitsmsreponse(const char *reponse,float timeout);
+};
+#endif
\ No newline at end of file
diff -r d63231e47571 -r 8eff8b2b35e8 sim800l.cpp
--- a/sim800l.cpp	Sun May 01 06:28:05 2022 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-
-#include "mbed.h"
-#include "sim800l.h"
-/*
-char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception
-char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
-char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
-char _Phrase[maxdata + 1]; // pour convertir en phrase avant envoi
-*/
-Sim800l::Sim800l(PinName tx, PinName rx, PinName resetpin,int baudrate):serial(tx,rx), reset (resetpin)
-{
-    reset.write(0);  //reset
-/*    _DataTmp = new char[maxdata + 1]; // tableau de donnees pour stocker pendant reception
-    _Data = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
-    _DataSms = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
-    _Phrase = new char[maxdata + 1]; // pour convertir en phrase avant envoi  
-    */  
-    _DataTmp[0] = 0;
-    _Data[0] = 0;
-    _DataPtr = 0;
-    _DataReady = false;
-    _SmsReady = false;
-    _IndexSms = 0;
-    serial.baud(baudrate);  // configure data baud
-}
-// retourne incdex du sms recu
-int Sim800l::IndexSmsRecu(void)
-{
-    return _IndexSms;
-}
-// return true si une phrase a ete recue
-bool Sim800l::dataready(void)
-{
-    return _DataReady;
-}
-// return phrase recu
-char * Sim800l::read(void)
-{
-    _DataReady = false;
-    return _Data;
-}
-// recoit les caractere serie et les stocke en tache de fond
-void Sim800l::receive()
-{
-    char inChar;
-    if (serial.readable()) {
-        inChar = serial.getc();
-        pc.putc(inChar);  // pour echo
-        switch (inChar) {
-            case '\n' :
-                if (_DataPtr > 1) {
-//                    pc.printf("-%s/\r\n",_DataTmp);
-                    if (strncmp(_DataTmp,"+CMTI:",6)==NULL) { // recoit sms +CMTI: "SM",3
-                        if (sscanf(_DataTmp,"+CMTI: \"SM\",%d",&_IndexSms)==1) _SmsReady = true;
-                    } else {  // cmde
-                        strcpy(_Data,_DataTmp);
-                        _DataReady = true;
-                    }
-                }
-                _DataTmp[0] = 0;
-                _DataPtr = 0;
-                break;
-            case 0 :
-                break;
-            case '\r' :
-                break;
-            case ' ' :
-                if (_DataPtr==1) {
-                    if ( _DataTmp[0]=='>') {
-                        strcpy(_Data,_DataTmp);
-                        _DataReady = true;
-                        _DataTmp[0] = 0;
-                        _DataPtr = 0;
-                        break;
-                    }
-                }
-            default :
-                _DataTmp[_DataPtr] = inChar;
-                _DataPtr = _DataPtr + 1;
-                _DataTmp[_DataPtr] = 0;
-        }
-        if (_DataPtr >= maxdata) {  // si phrase trop longue vide phrase
-            _DataTmp[0] = 0;
-            _DataPtr = 0;
-        }
-    }
-}
-// fonction appele en fin timerout
-void Sim800l::Ftimeout()
-{
-    FinTimeOut = true;
-}
-// defini time out et le lance
-void Sim800l::SetTimeout(float delay)
-{
-    FinTimeOut = false;
-    _timeout.attach(callback(this,&Sim800l::Ftimeout),delay);
-//  timeout.attach(callback(this, &Sonar::trigger_toggle), 10.0e-6);
-}
-// attente reponse dans *reponse jusqua timeout
-bool Sim800l::waitreponse(const char *reponse,float timeout)
-{
-    SetTimeout(timeout);
-    while (FinTimeOut==false) { // attente Ok
-        if (dataready()) {
-            if (strcmp(read(),reponse)==0) return true;
-        }
-    }
-    return false; // timeout ecoule donc erreur
-}
-// envoi commande et attend reponse
-bool Sim800l::writecmdandwaitreponse(const char *data, const char *reponse,float timeout)
-{
-    serial.printf("%s",data);
-    return waitreponse(reponse,timeout);
-}
-// initialise SIM800L en mode SMS Texte
-// configure baud
-// Renvoi
-// - true tout s'est bien passé
-// - false erreur
-// cmdecho = true --> copie donne de reponse sim800l vers pc
-bool Sim800l::init()
-{
-    bool resultat = true;
-    _DataTmp[0] = 0;
-    _Data[0] = 0;
-    _DataPtr = 0;
-    _DataReady = false;
-    _SmsReady = false;
-    _IndexSms = 0;
-    reset.write(0);  //reset
-    thread_sleep_for(200);
-    reset.write(1);
-    serial.attach(callback(this, &Sim800l::receive), RawSerial::RxIrq); // affecte interruption sur Rx
-    thread_sleep_for(1000);
-    int i=0;
-    while (!writecmdandwaitreponse("AT\n","OK",timeoutdefaut)) { // on attend 10 x pas plus
-        if (i++>10) return false;
-    }
-    if (!waitreponse("Call Ready",timewaitCallready)) return false;
-    if (!waitreponse("SMS Ready",timewaitSmsready)) return false;
-    return writecmdandwaitreponse("AT+CMGF=1\n","OK",timeoutdefaut);  // Passe sms mode texte
-}
-bool Sim800l::smsclearall(void)
-{
-    return writecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\n","OK",timewaitSmsallclear);  // efface sms
-
-}
-bool Sim800l::smsready(void)
-{
-    bool _SmsReadytemp = _SmsReady;
-    _SmsReady = false;
-    return _SmsReadytemp;
-}
-bool Sim800l::sendsms(const char *phonenumber,const char *data)
-{
-    if (!writecmdandwaitreponse("AT+CMGF=1\n","OK",timeoutdefaut)) return false;  // Passe sms mode texte
-    sprintf(_Phrase,"AT+CMGS=\"%s\"\n",phonenumber);
-    if (!writecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false;  // ouvre sms
-    sprintf(_Phrase,"%s%c\n",data,26);
-    return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message
-}
-// attente r eponse dans *reponse
-bool Sim800l::waitsmsreponse(const char *reponse,float timeout)
-{
-    char DataSmsOk = 0;
-    _DataSms[0] = 0;
-    SetTimeout(timeout);
-    while (FinTimeOut==false) { // attente Ok
-        if (dataready()) {
-//            pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
-            if (strcmp(read(),reponse)==0) return true;
-            if (strncmp(_Data,"+CMGR:",6)==NULL) DataSmsOk = 1;
-            else if (DataSmsOk!=0) {
-                if (DataSmsOk > 1)  strcat(_DataSms,",");
-                strcat(_DataSms,_Data);
-                DataSmsOk = 2;
-            }
-//            pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
-        }
-    }
-    return false; // timeout ecoule donc erreur
-}
-char *Sim800l::readtextesms()
-{
-    return _DataSms;
-}
-bool Sim800l::readsms(int index)
-{
-    serial.printf("AT+CMGR=%d,0\n",index);
-    return waitsmsreponse("OK",timeoutreadsms);
-}
\ No newline at end of file
diff -r d63231e47571 -r 8eff8b2b35e8 sim800l.h
--- a/sim800l.h	Sun May 01 06:28:05 2022 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-#ifndef _sim800l_
-#define _sim800l_
-#include "mbed.h"
-#include "MySerial.h"
-#ifndef maxdata
-#define maxdata 99   // taille des phrasers de dialogues.
-#endif
-#define timeoutdefaut 1
-#define timeoutsendsms 60
-#define timeoutreadsms 5
-#define timewaitCallready 10
-#define timewaitSmsready 60
-#define timewaitSmsallclear 25
-#define timewaitCCID 2
-
-extern MySerial pc;
-
-class Sim800l
-{
-public:
-    /*
-    * Constructor
-    *
-    * @param tx mbed pin to use for tx line of Serial interface
-    * @param rx mbed pin to use for rx line of Serial interface
-    * @param reset reset pin of the wifi module ()
-    */
-    Sim800l(PinName tx, PinName rx, PinName resetpin, int baudrate=9600);
-    bool init();
-    bool smsready(void);
-    bool sendsms(const char *phonenumber,const char *data);
-    bool readsms(int index);
-    bool smsclearall(void);
-    int IndexSmsRecu(void);
-    char *readtextesms();
-
-protected:
-    RawSerial serial;
-    DigitalOut reset;
-    /*    char *_DataTmp; // tableau de donnees pour stocker pendant reception
-        char *_Data; // tableau de donnees lorsque toutes les donnees sont recues
-        char *_DataSms; // tableau de donnees lorsque toutes les donnees sont recues
-        char *_Phrase; // pour convertir en phrase avant envoi
-        */
-
-    char _DataTmp[maxdata + 1]; // stocker pendant reception sur rxd en evenement
-    char _Data[maxdata + 1]; // stocke les donnees lorsqu'une phrase complete est recu 
-    char _DataSms[maxdata + 1]; // stocke donnee lorsquun sms est recu
-    char _Phrase[maxdata + 1]; // phrase temporaire pour convertir en phrase avant envoi fprintf
-
-    volatile int _DataPtr = 0; // position de stockage de la prochaine donnee a recevoir
-    volatile bool _DataReady = false;  // des donnees complete ont ete recus
-    volatile bool _SmsReady = false;  // un sms est recu
-    volatile int _IndexSms;   // contient lindex du sms
-    Timeout _timeout; // permet deviter blocage en attente
-    volatile bool FinTimeOut;  // 
-    
-    bool dataready(void);  // renvoi letat xe _dataready
-    char * read(void);
-    void receive();
-    void Ftimeout();
-    void SetTimeout(float delay);
-// attente r eponse dans *reponse
-    bool waitreponse(const char *reponse,float timeout);
-// envoi commande et attend reponse
-    bool writecmdandwaitreponse(const char *data, const char *reponse,float timeout);
-// attente reponse dans *reponse
-    bool waitsmsreponse(const char *reponse,float timeout);
-};
-#endif
\ No newline at end of file