Sim800l avec librairie sans class
sim800l-c.cpp
- Committer:
- schnf30
- Date:
- 2022-04-23
- Revision:
- 0:b7d51d3e0c1f
File content as of revision 0:b7d51d3e0c1f:
#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); }