Sim800l avec librairie sans class
Revision 0:b7d51d3e0c1f, committed 2022-04-23
- Comitter:
- schnf30
- Date:
- Sat Apr 23 08:21:57 2022 +0000
- Commit message:
- Sim800l avec librairie sans class
Changed in this revision
sim800l-c.cpp | Show annotated file Show diff for this revision Revisions of this file |
sim800l-c.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r b7d51d3e0c1f sim800l-c.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sim800l-c.cpp Sat Apr 23 08:21:57 2022 +0000 @@ -0,0 +1,177 @@ +#include "sim800l-c.h" +RawSerial sim800l(PA_9,PA_10); +DigitalOut sim800lreset (PA_12); + +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 +volatile int _DataPtr = 0; // position de stockage de la prochaine donnee a recevoir +volatile bool _DataReady = false; +volatile bool _SmsReady = false; +volatile int _IndexSms; +Timeout _timeout; // permet deviter blocage en attente +volatile bool FinTimeOut; +// recoit les caractere en tache de fond +int sim800lIndexSmsRecu(void) +{ + return _IndexSms; +} +bool sim800ldataready(void) +{ + return _DataReady; +} +char * sim800lread(void) +{ + _DataReady = false; + return _Data; +} +void sim800lreceive() +{ + char inChar; + if (sim800l.readable()) { + inChar = sim800l.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; + } + } +} +void Ftimeout() +{ + FinTimeOut = true; +} +void SetTimeout(float delay) +{ + FinTimeOut = false; + _timeout.attach(&Ftimeout,delay); +} +// attente r eponse dans *reponse +bool sim800lwaitreponse(const char *reponse,float timeout) +{ + SetTimeout(timeout); + while (FinTimeOut==false) { // attente Ok + if (sim800ldataready()) { + if (strcmp(sim800lread(),reponse)==0) return true; + } + } + return false; // timeout ecoule donc erreur +} +// envoi commande et attend reponse +bool sim800lwritecmdandwaitreponse(const char *data, const char *reponse,float timeout) +{ + sim800l.printf("%s",data); + return sim800lwaitreponse(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 sim800linit(int baudrate) +{ + bool resultat = true; + _DataTmp[0] = 0; + _Data[0] = 0; + _DataPtr = 0; + _DataReady = false; + _SmsReady = false; + _IndexSms = 0; + sim800l.baud(baudrate); // configure data baud + sim800l.attach(&sim800lreceive, RawSerial::RxIrq); // affecte interruption sur Rx + sim800lreset.write(0); //reset + thread_sleep_for(200); + sim800lreset.write(1); + thread_sleep_for(3000); + int i=0; + while (!sim800lwritecmdandwaitreponse("AT\r\n","OK",timeoutdefaut)) { // on attend 10 x pas plus + if (i++>10) return false; + } + if (!sim800lwaitreponse("Call Ready",timewaitCallready)) return false; + if (!sim800lwaitreponse("SMS Ready",timewaitSmsready)) return false; + return sim800lwritecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut); // Passe sms mode texte +} +bool sim800lsmsclearall(void) +{ + return sim800lwritecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\r\n","OK",timewaitSmsallclear); // efface sms + +} +bool sim800lsmsready(void) +{ + bool _SmsReadytemp = _SmsReady; + _SmsReady = false; + return _SmsReadytemp; +} +bool sim800lsendsms(const char *phonenumber,const char *data) +{ + if (!sim800lwritecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut)) return false; // Passe sms mode texte + sprintf(_Phrase,"AT+CMGS=\"%s\"\r\n",phonenumber); + if (!sim800lwritecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false; // ouvre sms + sprintf(_Phrase,"%s%c\r\n",data,26); + return sim800lwritecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message +} +// attente r eponse dans *reponse +bool sim800lwaitsmsreponse(const char *reponse,float timeout) +{ + char DataSmsOk = 0; + _DataSms[0] = 0; + SetTimeout(timeout); + while (FinTimeOut==false) { // attente Ok + if (sim800ldataready()) { +// pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms); + if (strcmp(sim800lread(),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 *sim800lreadtextesms() +{ + return _DataSms; +} +bool sim800lreadsms(int index) +{ + sim800l.printf("AT+CMGR=%d,0\r\n",index); + return sim800lwaitsmsreponse("OK",timeoutreadsms); +} \ No newline at end of file
diff -r 000000000000 -r b7d51d3e0c1f sim800l-c.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sim800l-c.h Sat Apr 23 08:21:57 2022 +0000 @@ -0,0 +1,20 @@ +#ifndef _sim800l_ +#define _sim800l_ +#include "mbed.h" +#define maxdata 1000 +#define timeoutdefaut 1 +#define timeoutsendsms 60 +#define timeoutreadsms 5 +#define timewaitCallready 10 +#define timewaitSmsready 60 +#define timewaitSmsallclear 25 +#define timewaitCCID 2 +bool sim800linit(int baudrate); +bool sim800lsmsready(void); +bool sim800lsendsms(const char *phonenumber,const char *data); +bool sim800lreadsms(int index); +bool sim800lsmsclearall(void); +int sim800lIndexSmsRecu(void); +char *sim800lreadtextesms(); +extern RawSerial pc; +#endif \ No newline at end of file