une 30aine passés sans pb entre les trames
Dependencies: ADS1015 ARNSRS_SENSORS DmTftLibrary MS5803_14BA SDFileSystem mbed
Fork of ARNSRS_SERVOS_USB_TFT by
Diff: main.cpp
- Revision:
- 2:4a8bf1d53439
- Parent:
- 1:bef7856b5c0a
- Child:
- 3:bc6d4222db12
--- a/main.cpp Sun Apr 30 09:05:42 2017 +0000 +++ b/main.cpp Sun Apr 30 23:29:19 2017 +0000 @@ -1,36 +1,46 @@ /* procédure lecture capteur COZIR ou MINIR - CO2 seul sur broches F401RE SERIAL PA_11 et PA_12 renvoie sur moniteur (IDE arduino par exemple) de la valeur lue + +procédures possibles sont : +request (char commande) - renvoie la valeur lue si la commande ne représente qu'un seul caractère (entre '') +cozirSend (string commande) - permet d'envoyer des commandes multicaractères (entre "") - exemple A 32 - donne la réponse obtenue + + +la fonction cozirSend est davantage "sécurisée" */ #include "mbed.h" +#include <string> Serial serialCozir (PA_11,PA_12,9600); Serial serialMonit (USBTX,USBRX,9600); -char reponse[6]; // buffer +char reponse[20]; // buffer -/////////////////////////////////// -// fonction initialisation ///// -/////////////////////////////////// -void setup(){ -serialCozir.puts("K 2\r\n"); // mode interrogation -serialMonit.printf("reponse au mode pooling %s\r\n",serialCozir.gets(reponse,5)); -serialCozir.puts("A 32\r\n"); // filtrage standard -serialMonit.printf("reponse au mode filtrage %s\r\n",serialCozir.gets(reponse,5)); -serialCozir.puts("G\r\n"); // calibration à l'air libre -serialMonit.printf("reponse au mode calib %s\r\n",serialCozir.gets(reponse,5)); -} + /////////////////////////////////// // fonction de lecture capteur///// /////////////////////////////////// -int requestCO2() { +int request(char commande) { int index=0; -char ch; -int valeurCO2; +char ch = ' ';; +int valeurCommande; // interrogation capteur -serialCozir.puts("Z\r\n"); +do + { + if (serialCozir.writeable()) { + serialCozir.putc(commande); + serialCozir.putc('\r'); + serialCozir.putc('\n'); + } + + while (!serialCozir.readable()) {} + ch = serialCozir.getc(); +} + +while ( ch != commande); // attente réponse capteur // le format de la reponse est : Z xxxxx z yyyyy\r\n @@ -39,21 +49,81 @@ do { if (serialCozir.readable()) - { - do - {ch = serialCozir.getc(); // on lit les caractères entrant jusqu'à recevoir la lettre Z majuscule - } - while (ch=='Z'); - + { ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine - if (index<6) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) + if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant - } + } } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse -sscanf (reponse,"%5d\r\n",&valeurCO2); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 -return valeurCO2; +sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 +return valeurCommande; +} + + +////////////////////////////////////// +// fonction communication capteur///// +// on peut envoyer des ordres avec /// +// plusieurs digits comme A 32 /// +////////////////////////////////////// +int cozirSend(string commande) { + + +int index=0; +char ch = ' ';; +int reponseCommande; +int nbDigits = commande.size(); + +commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' + +// interrogation capteur +do + { + if (serialCozir.writeable()) { + for (int j=0;j<nbDigits;j++) { + serialCozir.putc(commande[j]); + //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug + } + serialCozir.putc('\r'); + serialCozir.putc('\n'); + } + + while (!serialCozir.readable()) {}; + ch = serialCozir.getc(); +} + +while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre + +// attente réponse capteur +// exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n +// c'est uniquement xxxxx qui nous interesse + +do +{ + if (serialCozir.readable()) + { + ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine + if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) + reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant + } +} while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse + +//reponse[index++]='\x0'; // mettre un zero à la fin de la reponse +sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande +//serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug + +return reponseCommande; +} +/////////////////////////////////// +// fonction initialisation ///// +/////////////////////////////////// +void setup(){ + +serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); +serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); +serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); + } ///////////////////////////////////// @@ -62,8 +132,14 @@ int main(){ setup(); //initialisation capteur + while (1){ - serialMonit.printf("co2 COZIR= %d\r\n",requestCO2()*10); // on multiplie par 10 pour etre en ppm + serialMonit.printf("co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm + serialMonit.printf("co2 COZIR par methode request = %5d\r\n" ,request('Z')*10); // on multiplie par 10 pour etre en ppm (méthode précédente) + serialMonit.printf(" H COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("H")); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + serialMonit.printf(" H COZIR par methode request = %5d\r\n" ,request('H')); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% + serialMonit.printf(" T COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("T")-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C + serialMonit.printf(" T COZIR par methode request = %5d\r\n" ,request('T')-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C wait (1); } } \ No newline at end of file