Reception serie evenement suoivant protocole $x,.,.,.terminaison terminaison est \r, \n ou \r\n

Dependents:   0-sim5320e-L432KC-relais-0 0-DISCO-F746NG-Sim-soufflerie-PID

Committer:
schnf30
Date:
Thu May 12 07:26:24 2022 +0000
Revision:
0:88efe939415b
Reception serie evenement suoivant protocole $x,.,.,.terminaison terminaison est \r, \n ou \r\n

Who changed what in which revision?

UserRevisionLine numberNew contents of line
schnf30 0:88efe939415b 1 #include "mbed.h"
schnf30 0:88efe939415b 2 #include "MySerial.h"
schnf30 0:88efe939415b 3 //
schnf30 0:88efe939415b 4 MySerial::MySerial(PinName Txd, PinName Rxd, float TimeOut) : RawSerial(Txd,Rxd)
schnf30 0:88efe939415b 5 {
schnf30 0:88efe939415b 6 baud(Baud);
schnf30 0:88efe939415b 7 _TimeOut = TimeOut;
schnf30 0:88efe939415b 8 // _DataTmp = new char[maxdata + 1];
schnf30 0:88efe939415b 9 // _Data = new char[maxdata + 1];
schnf30 0:88efe939415b 10 _DataPtr = 0;
schnf30 0:88efe939415b 11 _DataReady = false;
schnf30 0:88efe939415b 12 _Canal1Ok = false;
schnf30 0:88efe939415b 13 _Canal2Ok = false;
schnf30 0:88efe939415b 14 attach(callback(this,&MySerial::receive), RawSerial::RxIrq);
schnf30 0:88efe939415b 15 if (_TimeOut != NULL) TGarde.attach(callback(this,&MySerial::Tevent),_TimeOut); // pour chien de garde
schnf30 0:88efe939415b 16 }
schnf30 0:88efe939415b 17 void MySerial::Tevent(void) // chien de garde
schnf30 0:88efe939415b 18 {
schnf30 0:88efe939415b 19 if (!_Canal1Ok) printf("$Y\r\n");
schnf30 0:88efe939415b 20 if (!_Canal2Ok) printf("$y\r\n");
schnf30 0:88efe939415b 21 _Canal1Ok = false;
schnf30 0:88efe939415b 22 _Canal2Ok = false;
schnf30 0:88efe939415b 23 }
schnf30 0:88efe939415b 24 char * MySerial::read(void)
schnf30 0:88efe939415b 25 {
schnf30 0:88efe939415b 26 _DataReady = false;
schnf30 0:88efe939415b 27 return _Data;
schnf30 0:88efe939415b 28 }
schnf30 0:88efe939415b 29
schnf30 0:88efe939415b 30 bool MySerial::dataready(void)
schnf30 0:88efe939415b 31 {
schnf30 0:88efe939415b 32 return _DataReady;
schnf30 0:88efe939415b 33 }
schnf30 0:88efe939415b 34
schnf30 0:88efe939415b 35 // reception phrase de type '$' "....' "\r\n"
schnf30 0:88efe939415b 36 void MySerial::receive(void)
schnf30 0:88efe939415b 37 {
schnf30 0:88efe939415b 38 bool _PhraseComplete = false;
schnf30 0:88efe939415b 39 char inChar;
schnf30 0:88efe939415b 40 while (readable() && (_PhraseComplete == false)) {
schnf30 0:88efe939415b 41 inChar = getc();
schnf30 0:88efe939415b 42 switch (inChar) {
schnf30 0:88efe939415b 43 case '$' :
schnf30 0:88efe939415b 44 _DataPtr = 0;
schnf30 0:88efe939415b 45 _DataTmp[_DataPtr++] = inChar;
schnf30 0:88efe939415b 46 _DataTmp[_DataPtr] = 0;
schnf30 0:88efe939415b 47 break;
schnf30 0:88efe939415b 48 case '\r' :
schnf30 0:88efe939415b 49 ;
schnf30 0:88efe939415b 50 case '\n' :
schnf30 0:88efe939415b 51 if (_DataPtr > 1) {
schnf30 0:88efe939415b 52 strcpy(_Data,_DataTmp);
schnf30 0:88efe939415b 53 _PhraseComplete = true;
schnf30 0:88efe939415b 54 if (_TimeOut!=NULL) {
schnf30 0:88efe939415b 55 if ((_Data[1] >> 5)==2) _Canal1Ok = true;
schnf30 0:88efe939415b 56 if ((_Data[1] >> 5)==3) _Canal2Ok = true;
schnf30 0:88efe939415b 57 }
schnf30 0:88efe939415b 58 }
schnf30 0:88efe939415b 59 _DataTmp[0] = 0;
schnf30 0:88efe939415b 60 _DataPtr = 0;
schnf30 0:88efe939415b 61 break;
schnf30 0:88efe939415b 62 default :
schnf30 0:88efe939415b 63 if (_DataPtr > 0) {
schnf30 0:88efe939415b 64 _DataTmp[_DataPtr++] = inChar;
schnf30 0:88efe939415b 65 _DataTmp[_DataPtr] = 0;
schnf30 0:88efe939415b 66 }
schnf30 0:88efe939415b 67 }
schnf30 0:88efe939415b 68 if (_DataPtr >= maxdata) { // si phrase trop longue vide phrase
schnf30 0:88efe939415b 69 _DataTmp[0] = 0;
schnf30 0:88efe939415b 70 _DataPtr = 0;
schnf30 0:88efe939415b 71 _PhraseComplete = false;
schnf30 0:88efe939415b 72 }
schnf30 0:88efe939415b 73 }
schnf30 0:88efe939415b 74 _DataReady = _PhraseComplete;
schnf30 0:88efe939415b 75 }