Lib SIM5320 avec SMS
Dependents: 0-sim5320e-L432KC-relais-0
Revision 1:8eff8b2b35e8, committed 2022-05-18
- 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
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