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
MySerial.cpp@0:88efe939415b, 24 months ago (annotated)
- 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?
User | Revision | Line number | New 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 | } |