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

Files at this revision

API Documentation at this revision

Comitter:
schnf30
Date:
Thu May 12 07:26:24 2022 +0000
Commit message:
Reception serie evenement suoivant protocole $x,.,.,.terminaison terminaison est \r, \n ou \r\n

Changed in this revision

MySerial.cpp Show annotated file Show diff for this revision Revisions of this file
MySerial.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 88efe939415b MySerial.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySerial.cpp	Thu May 12 07:26:24 2022 +0000
@@ -0,0 +1,75 @@
+#include "mbed.h"
+#include "MySerial.h"
+// 
+MySerial::MySerial(PinName Txd, PinName Rxd, float TimeOut) : RawSerial(Txd,Rxd)
+{
+    baud(Baud);
+    _TimeOut = TimeOut;
+//    _DataTmp = new char[maxdata + 1];
+//    _Data = new char[maxdata + 1];
+    _DataPtr = 0;
+    _DataReady = false;
+    _Canal1Ok = false;
+    _Canal2Ok = false;
+    attach(callback(this,&MySerial::receive), RawSerial::RxIrq);
+    if (_TimeOut != NULL) TGarde.attach(callback(this,&MySerial::Tevent),_TimeOut);  // pour chien de garde
+}
+void MySerial::Tevent(void)  // chien de garde
+{
+    if (!_Canal1Ok) printf("$Y\r\n");
+    if (!_Canal2Ok) printf("$y\r\n");
+    _Canal1Ok = false;
+    _Canal2Ok = false;
+}
+char * MySerial::read(void)
+{
+    _DataReady = false;
+    return _Data;
+}
+
+bool MySerial::dataready(void)
+{
+    return _DataReady;
+}
+
+// reception phrase de type '$' "....' "\r\n"
+void MySerial::receive(void)
+{
+    bool _PhraseComplete = false;
+    char inChar;
+    while (readable() && (_PhraseComplete == false)) {
+        inChar = getc();
+        switch (inChar) {
+            case '$' :
+                _DataPtr = 0;
+                _DataTmp[_DataPtr++] = inChar;
+                _DataTmp[_DataPtr] = 0;
+                break;
+            case '\r' :
+                ;
+            case '\n' :
+                if (_DataPtr > 1) {
+                    strcpy(_Data,_DataTmp);
+                    _PhraseComplete = true;
+                    if (_TimeOut!=NULL) {
+                        if ((_Data[1] >> 5)==2)     _Canal1Ok = true;
+                        if ((_Data[1] >> 5)==3)     _Canal2Ok = true;
+                    }
+                }
+                _DataTmp[0] = 0;
+                _DataPtr = 0;
+                break;
+            default :
+                if (_DataPtr > 0) {
+                    _DataTmp[_DataPtr++] = inChar;
+                    _DataTmp[_DataPtr] = 0;
+                }
+        }
+        if (_DataPtr >= maxdata) {  // si phrase trop longue vide phrase
+            _DataTmp[0] = 0;
+            _DataPtr = 0;
+            _PhraseComplete = false;
+        }
+    }
+    _DataReady = _PhraseComplete;
+}
diff -r 000000000000 -r 88efe939415b MySerial.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySerial.h	Thu May 12 07:26:24 2022 +0000
@@ -0,0 +1,74 @@
+#ifndef _MySerial_
+#define _MySerial_
+// driver interface serie
+// cette class permet de recevoir et transmettre des donnees serie suivant un protocole
+// $x,.,.,.,.terminaison  // terminaison peut etre "\r","\n" ou "\r\n"
+// les donnees sont acquises en tache de fond.
+//
+// Les méthodes :
+// - MySerial(PinName Txd, PinName Rxd,float _TimeOut=NULL);  // param txd et rxd. Timeout pas obligatoire
+// - bool dataready(void); : retourne true lorsquune phrase est acquise
+// - char * read(void); : retourne phrase lue sans la terminaison
+//
+// exemple
+// dans main.cpp
+/*
+#include "mbed.h"
+#include "MySerial.h"
+//
+//
+
+MySerial PC(USBTX,USBRX); // liaison PC
+char PCPhrase[maxdata];    // pour stocker phrase PC
+
+void main (void)
+{
+    // recevoir des donnees
+    if (PC.dataready()) {
+        strcpy(PCPhrase,PC.read()); // PCPhrase contient la phrase recu
+        switch (PCPhrase[1]) {
+            case 'B': // consigne de flux air
+                ConsVitFluxAir = atof(PCPhrase+2); //
+                datachange=true;   // on indique qune donne a change
+                break;
+            case 'L' :  // param pid
+                if (sscanf(PCPhrase,"$L,%f,%f,%f",&coefp,&coefi,&coefd)>=1) datachange=true;
+                break;
+            default :
+                ;
+        }
+    }
+
+ if ((EnvoiePC!=0)&&(PCOk==true)) {
+     while (!PC.writeable());
+      PC.printf("$V,%0.1f,%0.1f\r\n",VitFluxAir,Frequencehelice);
+     }
+}
+*/
+// taille maximum d'une phrase recue
+#ifndef maxdata
+#define maxdata 99
+#endif
+#define Baud 921600
+class MySerial : public RawSerial
+{
+public:
+    MySerial(PinName Txd, PinName Rxd,float _TimeOut=NULL);      // _TimeOute pour chien de garde en s
+    bool dataready(void);
+    char * read(void);
+private:
+// reception phrase Serial
+    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 *_DataTmp; // tableau de donnees pour stocker pendant reception
+//    char *_Data; // tableau de donnees lorsque toutes les donnees sont recues
+    int _DataPtr; // position de stockage de la prochaine donnee a recevoir
+    bool _Canal1Ok;
+    bool _Canal2Ok;
+    Ticker TGarde;
+    bool _DataReady;
+    float _TimeOut;
+    void receive();  //recoit les data gps et les stocks puis produit les donnees en cas de reception
+    void Tevent(void);
+};
+#endif