Auteur Sujet: Bus CAN et Décimal  (Lu 41110 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #15 le: avril 27, 2020, 02:31:00 pm »
Et bien il faut mettre des identifiants différents selon le capteur.

C'est l'objet du prochain article.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3038
  • 100% Arduino et N
    • Voir le profil
Re : Re : Bus CAN et Décimal
« Réponse #16 le: avril 27, 2020, 07:39:27 pm »
Ah oui, une question :
comment pour ajouter plusieurs mesures de capteur, plusieurs sondes ???

 8)
Bah, il faut faire plusieurs messages ou combiner plusieurs mesures dans les 8 octets d'un message (la 1ère solution est préférable, le Can est rapide et ne perd rien.

Ah, Jean-Luc a déjà répondu avant moi...
« Modifié: avril 27, 2020, 07:40:58 pm par Dominique »
Cordialement,
Dominique

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #17 le: avril 28, 2020, 09:48:33 am »
Bonjour,

Pierre a fait une release (version 2.0.4). Exit l'union, il suffit maintenant d'écrire :

Côté émetteur :

message.dataFloat[0] = val;
controleurCAN.tryToSend(message);

Côté récepteur :

if (controleurCAN.receive(message)) {
  float val = message.dataFloat[0];
  ...
}
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #18 le: avril 28, 2020, 03:29:02 pm »
Jean-Luc Bonjour

...release (version 2.0.4) , mis a jour biblio de l'IDE et modification comme dit.

Impeccable, les croquis on encore Rétréci, cela devient inquiétant  :P  :)

donc je passe les codes Arduino en version 2, avec la modif du float et ajout d'un capteur DHT22 (temp/humidité)
( les version 1 reste pour les nouveaux arrivant ??)

Emi_dht_ACAN2515_v2.ino

/*
 * Locoduino: 1er mai 2020
 * https://www.locoduino.org/spip.php?article268
 *
 * Envoi et Réception de valeur numerique a deux digit apres la virgule
 * (valeur positif ou négatif)
 *
 * sur une base de Locoduino (JL) et bricol par JeeLet
 *
 * - librarie ACAN2515 ver.2.0.4  de pierre Molinaro https://github.com/pierremolinaro/acan2517
 * - librarie "dhtnew.h" Ver:0.1.5 de Rob Tillaart's
 *
 * -X- compil des exemples 1 et 2 (partie eraser)
 * -X- Ajout partie float "virgule" et valeur négatif
 * -X- ajout capteur DHT22 (température-humidité)
 * -X- ver. 2.0.4 de ACAN2515 (ajout float) et croquis V1 en V2
 * -o- gestion des ID can pour multi capteurs (quatres ?)
 * -o-
 */
// ------------- Debut Pgm Emission ----------------

 // ----- inclusion des bibliothèques -------------
   #include <ACAN2515Settings.h>      // les reglages
   #include <ACAN2515.h>              // le controleur
   #include <CANMessage.h>            // les messages
   #include <dhtnew.h>                // Capteur temp/humi

// ------ config des E/S -----------
   static const uint8_t MCP2515_CS  = 10;  // pin SPI_CS
   static const uint8_t MCP2515_INT = 2;   // pin interruption

   DHTNEW dht1  (5);      // pin capteur DHT22   

// ------- les déclarations ----------
// objet de type ACAN2515 est instancié pour gérer le MCP2515
 
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); //pin CS,SPI ,pin INT.
   static const uint32_t FREQUENCE_DU_QUARTZ = 8000000; // quartz du MCP2515 en hertz
   static const uint32_t FRENQUENCE_DU_BUS_CAN = 125000;  // fréquence du bus CAN

   CANMessage message;    // objets pour les messages CAN en emission.

//  ----------------- capteur1 DHT22 -----------
    float t1 = 0.0;     // température
    float h1 = 0.0;     // humidité
       
    static uint32_t milliEnvoi = 0;         // Tempo d’envoi CAN
       
// -------------- Setup --------------
  void setup()  {
  Serial.begin(9600);           // com série
  SPI.begin();                  // bus SPI
  dht1.read();            // lecture capteurs 
 
  Serial.println("Configuration du MCP2515");
  ACAN2515Settings configuration(FREQUENCE_DU_QUARTZ, FRENQUENCE_DU_BUS_CAN);
 
// ----  Demarrage et control d'erreur du CAN ----
  const uint32_t codeErreur = CAN.begin(configuration, [] { CAN.isr(); });
   
    if (codeErreur == 0)   
      {
      Serial.println("Configuration ok");
      }
    else
      {
      Serial.println("Probleme de connexion");
      while (1);
      }
     
    message.len = 4;      //message avec 4 octets de donnee
 }
 
//------------ Loop --------------
  void loop()
 {
  uint16_t milliEncour = millis();
    if (milliEncour - milliEnvoi >= 6000)  //envoi toutes les 2 secondes
    {
// ------------- partie capteur ----------------     
  capteur();              //apl sous pgm du capteur
  h1 = dht1.humidity ;    //humidite 1
  t1 = dht1.temperature;  //Temperature 1
           
// ------------- partie CAN ----------------   

    message.dataFloat[0] = t1;    // valeur float du capteur
    CAN.tryToSend(message);       // envoi CAN
   
      Serial.print(t1);
      Serial.print(" Temp --Emi--> ");
      Serial.println(message.data32[0]);

      Serial.print(h1);
      Serial.print(" hum --Emi--> ");
      Serial.println(message.data32[0]);
   
      milliEnvoi = milliEncour;     // reset tempo
     }
  }

              // ------ control Capteurs ------
 void capteur()
  {
   int chk = dht1.read();
    switch (chk)
    {
    case DHTLIB_OK:
      Serial.println("DHT22 OK,\t");
      break;
    case DHTLIB_ERROR_CHECKSUM:
      Serial.println("Checksum error,\t");
      break;
    case DHTLIB_ERROR_TIMEOUT:
      Serial.println("Time out error,\t");
      break;
    default:
      Serial.println("Unknown error,\t");
      break;
    }
        // ----- fin sous pgm ------------   
 }
 
// ----------- Fin du pgm ------------------


Rec_dht_ACAN2515_v2.ino

/*
 * Locoduino: 1er mai 2020
 * https://www.locoduino.org/spip.php?article268
 *
 * Envoi et Réception de valeur numerique a deux digit apres la virgule
 * (valeur positif ou négatif)
 *
 * sur une base de Locoduino (JL) et bricol par JeeLet
 *
 * - librarie  ACAN2515 ver.2.0.4  de pierre Molinaro https://github.com/pierremolinaro/acan2517
 * - librarie "dhtnew.h" Ver:0.1.5 de Rob Tillaart's
 *
 * -X- compil des exemples 1 et 2 (partie eraser)
 * -X- Ajout partie float "virgule" et valeur négatif
 * -X- ajout DHT22 (température-humidité) en Emission
 * -X- ver. 2.0.4 de ACAN2515 ( ajout float) et croquis V1 en V2
 * -o- gestion des ID can pour multi capteurs (quatres ?)
 * -o-
 */
// ------------- Debut Pgm Reception ----------------

 // ----- inclusion des bibliothèques -------------
   #include <ACAN2515Settings.h>       // les reglages
   #include <ACAN2515.h>               // le controleur
   #include <CANMessage.h>             // les messages

// ------ config des E/S -----------
   static const uint8_t MCP2515_CS  = 10;  // pin SPI_CS
   static const uint8_t MCP2515_INT = 2;   // pin interruption

// ------- les déclarations ----------
// objet de type ACAN2515 est instancié pour gérer le MCP2515
 
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); //pin CS,SPI ,pin INT.
   static const uint32_t FREQUENCE_DU_QUARTZ = 8000000; // quartz du MCP2515 en hertz
   static const uint32_t FRENQUENCE_DU_BUS_CAN = 125000;  // fréquence du bus CAN

    CANMessage message;     // objets pour les messages CAN
   
// -------------- Setup --------------
  void setup()  {
  Serial.begin(9600);           // com série
  SPI.begin();                  // bus SPI
 
  Serial.println("Configuration du MCP2515");
  ACAN2515Settings configuration(FREQUENCE_DU_QUARTZ, FRENQUENCE_DU_BUS_CAN);
 
// ----  Demarrage et control d'erreur du CAN ----
  const uint32_t codeErreur = CAN.begin(configuration, [] { CAN.isr(); });
   
  if (codeErreur == 0) 
    {
    Serial.println("configuration ok");
    }
  else
    {
    Serial.println("Probleme de connexion");
    while (1);
    }
 }

//------------ Loop --------------
  void loop()
 {
   if (CAN.receive(message))  // signal arrive message CAN
    {
    float val1 = message.dataFloat[0];
    Serial.print(" --Rec--> ");
    Serial.println(val1); 
    }
 }
// -------------- fin Pgm -------------------

Jean-Luc Merci
« Modifié: avril 28, 2020, 04:32:05 pm par JeeLet »

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #19 le: mai 14, 2020, 11:29:09 am »
Bonjour

Modif des croquis du dessus, alléger pour plus de clarté
  (valeurs des capteurs température virtuel )
il me reste la partie masque et filtre ou toujours rien ne fonctionnent

le détail :

Partie Émission :
/*  CAN : numero des (éléments) capteurs pour les messages  */
  const uint16_t CAPTEUR1 = 10; /* le Capteur */
  .....

    /*  Nbr de Bits pour les poids fort et faible  */
  const uint16_t NBBITS_TYPE_MESSAGE = 6;   /* Groupe */
  const uint16_t NBBITS_ID_CAPTEUR = 5;     /* Element */

  const uint16_t MESSAGE_GROUPE = 4;  /*type de message (le Groupe 7,la clim)*/
  const uint16_t MASK = MESSAGE_GROUPE << NBBITS_ID_CAPTEUR;

  const uint16_t ID_1 = (MESSAGE_GROUPE << NBBITS_ID_CAPTEUR) | CAPTEUR1;
  ....

                 --------------------------
me donne sur le terminal
---------------------------
80   10000000  le masque  "MASK"
 ---------------------------
8A  :Msg1 envoye:  10001010  et les capteurs
8B  :Msg2 envoye:  10001011
8C  :Msg3 envoye:  10001100
                    -----------------------------

Pour la partie Réception:
...
const uint16_t capteurs = message.id & 0x8A;   le   capteur 1
const uint16_t capteurs = message.id & 0x8B;    2
const uint16_t capteurs = message.id & 0x8C;   3
...
et
..
  const ACAN2515Mask masque = standard2515Mask( 0, 0, 0);
  const ACAN2515AcceptanceFilter filtres[] =  { 
   { standard2515Filter( 0, 0, 0), receive1 }
.../
(masque mis à Zéro)

         ------------------------------
Visu sur le terminal des valeurs:
numero capteurs: 138 : 138 : 136
11.11 <--T1 --A-- H1--> 51.11
11.11 <--T2 --B-- H2--> 51.11
11.11 <--T3 --C-- H3--> 51.11
numero capteurs: 138 : 139 : 136
22.22 <--T1 --A-- H1--> 52.22
22.22 <--T2 --B-- H2--> 52.22
22.22 <--T3 --C-- H3--> 52.22
               ----------------------
c'est le fouillis  8)  :'(

Question:  quelles valeur Hexa a Changer / Ajouter ?????

j'ai tester toutes les combinaison possible depuis 3 jours, et rien de rien de valable
même crée un pdf sur la question  ;)

Voili Voila

merci

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #20 le: mai 14, 2020, 11:51:08 am »
Bonjour,

En réception, je ne comprends rien à ce que tu essayes de faire.

Quel est le sens de :

    const uint16_t capteurs = message.id & 0x8A; /* adresse capteur */

?

message.id c'est l'identifiant du message. Normalement le numéro du capteur étant dans les 5 bits de poids faible, il faut l'isoler en faisant :

    const uint16_t capteur = message.id & 0x1F;

Et c'est tout

Je ne comprends pas la triplication du code de réception. Pour « classer les message » il faudrait au moins faire des test !  :)
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #21 le: mai 14, 2020, 12:09:54 pm »
...... "faire des test !"

bonjour Jean-Luc

mais les Test c Ok

un exemple de recopie du terminal

la c'est modifiant les Numéro des Groupes :
pour Nbits Msg :6 / Nbits Capt:5
           Msg Groupe:
  0   0                  0
 20   100000         1
 40   1000000         2
 60   1100000         3
 80   10000000         4
 A0   10100000         5   
 C0   11000000         6   
 E0   11100000         7
100   100000000      8

la c les numéro des capteurs:
B5  :Msg1 envoye:  10110101   21
B6  :Msg2 envoye:  10110110   22
B7  :Msg3 envoye:  10110111   23

et des valeurs mis en Hexa coter réception

Rein ni fait, je cale et il me manque une cale 

 :-X





Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #22 le: mai 14, 2020, 12:23:48 pm »
Je ne parle pas de faire des tests du logiciel

Je parle de tester l'identifiant du message reçu pour savoir de quel message il s'agit !

switch (message.id & 0x1F) {
  case CAPTEUR1: ...
    break;
  case CAPTEUR2: ...
    break;

...

Tu devrais aller lire https://www.locoduino.org/spip.php?article70 parce que là il te manque pas mal de bases
« Modifié: mai 14, 2020, 12:27:00 pm par Jean-Luc »
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #23 le: avril 22, 2022, 12:34:08 pm »

Bonjour

un demande d'aide sur comment signaler a la partie réception que l"émetteur est hors service?
ou que les données coter réception ne sont plus actualisé.

Lorsqu'une perte de com. intervient entre l'émetteur et récepteur CAN,  les valeurs coté récepteur sont fausses , le récepteur garde la dernière valeur.

comment mettre c'est valeur à Zéro ??

les deux croquis

Emission ACAN2515_Test_Tx.ino

/*
*     
*   DESCRIPTION : Test bus CAN de valeur décimal sur Arduino UNO avec pseudo sonde DHT22 
*                 avec 2 croquis,
*                 ACAN2515_Test_Tx.ino et ACAN2515_Test_Rx.ino

*   BASES : sur une base https://www.locoduino.org/spip.php?article268
*         : Sujet: Bus CAN et Décimal
*         
*  * Libraries:
 * - ACAN2515 ver.2.1.0 de pierre Molinaro
 * - https://github.com/pierremolinaro/acan2515
*
* Modif/Afaire:
* -o- a revoir filtrage non fonctionnelle
* -o- sur perte CAN émission les valeurs ne sont pas mises à zéro
* -o- 
* -o-
*   (3%) de l'espace de stockage de programmes               
*               
*/
        //----------- 2022 ---------------- Fonctionnelle -----------------//

 // ----- inclusion des bibliothèques -------------
   #include <ACAN2515_Buffer16.h>
   #include <ACANBuffer.h>
   #include <ACAN2515Settings.h>      // les reglages
   #include <ACAN2515.h>              // le controleur
   #include <CANMessage.h>            // les messages
 
  /*  Module CAN MCP2515 */
   static const uint8_t MCP2515_CS  = 10;  /* pin SPI_CS */
   static const uint8_t MCP2515_INT = 2;   /* pin interruption */
   
    /* objet de type ACAN2515 est instancié pour gérer le MCP2515  */
    ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); /* pin CS,SPI ,pin INT */
   static const uint32_t FREQUENCE_DU_QUARTZ = 8ul * 1000ul * 1000ul; /*quartz du MCP2515*/
   static const uint32_t FREQUENCE_DU_BUS_CAN = 125ul * 1000ul;  /*fréquence du bus*/

   CANMessage messageCANdht;    /* objets CAN pour les messages en emission */
 
  /*  CAN : numero des capteurs pour les messages  */
      const uint16_t ID_1 = 10;
      const uint16_t ID_2 = 11;

//----------Virtuel DHT22 ---------------
    /* capteur1  */
    float t1 = 21.5;     // température
    float h1 = 51.5;     // humidité
    /*  capteur2   */
    float t2 = 22.6;     // température
    float h2 = 52.6;     // humidité
       
    static uint32_t milliEnvoi = 0;         // Tempo d’envoi des messages CAN
   

  void setup()  {     // -------------- Setup --------------
  Serial.begin(115200);   /* com série */
  SPI.begin();          /* bus SPI */
 
  Serial.println("Configuration du MCP2515");
  /* création de l'objet ACAN2515Settings */
  ACAN2515Settings reglages(FREQUENCE_DU_QUARTZ, FREQUENCE_DU_BUS_CAN);
 
  /* objet nommer "reglages" dans l'exemple */
  reglages.mReceiveBufferSize = 0;  // nbr d'emplacement buffer
  reglages.mTransmitBuffer0Size = 3;  // file d'attente d'emission
 
    /* Demarrage et control d'erreur du CAN */
  const uint16_t codeErreur = CAN.begin(reglages, [] { CAN.isr(); });
    if (codeErreur == 0)   
      {
      Serial.println("Configuration ok");
      }
    else
      {
      Serial.println("Probleme de connexion");
      while (1);
      }
     
    /* longeur des messages CAN */
  messageCANdht.len = 8;  // 8 octets pour les 2 float (temp-humid)
 }

  void loop() //------------------ Loop --------------
 {

// --------------- envoie des messages CAN ----------------------------   
  uint16_t milliEncour = millis();          /* Tempo d'envoi ..*/
    if (milliEncour - milliEnvoi >= 4000)   {  /*..toutes les 4 secondes */

//capteur1 ----------------------- 
   messageCANdht.id = ID_1;     /*Numéro d'intentifiant*/
   messageCANdht.dataFloat[0] = t1;
   messageCANdht.dataFloat[1] = h1;
    if (CAN.tryToSend(messageCANdht)) {
    Serial.println("message 1 envoyer");
  Serial.print(" : t=");
  Serial.print(messageCANdht.dataFloat[0]);
  Serial.print(" , h=");
  Serial.println(messageCANdht.dataFloat[1]);
  Serial.println("       -----------------");
    }

//capteur2 -----------------------   
   messageCANdht.id = ID_2;
   messageCANdht.dataFloat[0] = t2;
   messageCANdht.dataFloat[1] = h2;
    if (CAN.tryToSend(messageCANdht)) {
    Serial.println("message 2 envoyer");
  Serial.print(" : t=");
  Serial.print(messageCANdht.dataFloat[0]);
  Serial.print(" , h=");
  Serial.println(messageCANdht.dataFloat[1]);
  Serial.println("       -----------------"); 
    }
    milliEnvoi = milliEncour;     /* reset de la tempo */
    }
  }

 // ----------- Fin du pgm ------------------


réception ACAN2515_Test_Rx.ino

/*
*     
*   DESCRIPTION : Test bus CAN de valeur décimal sur Arduino UNO avec pseudo sonde DHT22 
*                 avec 2 croquis,
*                 ACAN2515_Test_Tx.ino et ACAN2515_Test_Rx.ino

*   BASES : sur une base https://www.locoduino.org/spip.php?article268
*         : Sujet: Bus CAN et Décimal
*         
*  * Libraries:
 * - ACAN2515 ver.2.1.0 de pierre Molinaro
 * - https://github.com/pierremolinaro/acan2515
*
* Modif/Afaire:
* -o- a revoir filtrage non fonctionnelle
* -o- sur perte CAN émission les valeurs ne sont pas mises à zéro
* -o- 
* -o-
*   (3%) de l'espace de stockage de programmes               
*               
*/
        //----------- 2022 ---------------- Fonctionnelle -----------------//

 /* ----- inclusion des bibliothèques -------------*/
   #include <ACAN2515_Buffer16.h>           /* les buffers */
   #include <ACANBuffer.h>
   #include <ACAN2515Settings.h>       /* les reglages */
   #include <ACAN2515.h>               /* le controleur*/
   #include <CANMessage.h>             /* les messages */
 
/* ----- capteurs virtuelle  -------------*/ 
  float  T1;  float   H1;  /*capteur 1 */
  float  T2;  float   H2;  /*capteur 2 */
 
/*  Module CAN MCP2515 */
   static const uint8_t MCP2515_CS  = 53;  /* pin SPI_CS */
   static const uint8_t MCP2515_INT = 2;   /* pin interruption */

/* objet de type ACAN2515 est instancié pour gérer le MCP2515  */
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); /* pin CS,SPI ,pin INT */
   static const uint32_t FREQUENCE_DU_QUARTZ = 8ul * 1000ul * 1000ul; /*quartz du MCP2515*/
   static const uint32_t FREQUENCE_DU_BUS_CAN = 125ul * 1000ul;  /*fréquence du bus*/

   CANMessage message;     // objets CAN pour les messages en réception

// -------------- Reception msg CAN    --------------------------

  void receive1 (const CANMessage & message)  {   
  const uint16_t capteurs = message.id & 0x1F;
 
 switch (capteurs) {            /* ---- classement des messages CAN ----*/
  case 10:
    T1 = message.dataFloat[0];      /* ---- capteur A ----*/
    H1 = message.dataFloat[1];
    break;
  case 11:
    T2 = message.dataFloat[0];       /* ---- capteur B ----*/
    H2 = message.dataFloat[1];
    break;
     }
   }

/* ----- défini masques et filtres pour les messages  ------*/
  const ACAN2515Mask masque = standard2515Mask( 0, 0, 0);
  const ACAN2515AcceptanceFilter filtres[] =  { 
   { standard2515Filter( 0, 0, 0), receive1 }
    };

// --- defilement pour Debug --------------------------
  unsigned long previousMillis = 0;  /*reset du compteur des millisecondes*/
  const long interval = 10000; /*Fréquence affichage debug (1000millisecondes=1mn) */

//-------------------------- SETUP ------------------------//                 
  void setup()   {
   
  Serial.begin(115200);           /* com série */
  SPI.begin();                  /* bus SPI */
   
  Serial.println("Configuration du MCP2515");
  ACAN2515Settings reglages(FREQUENCE_DU_QUARTZ, FREQUENCE_DU_BUS_CAN);

  reglages.mReceiveBufferSize = 4;      /* nbr d'emplacement buffer*/
  reglages.mTransmitBuffer0Size = 0;    /* file d'attente d'emission*/
 
  /* Demarrage et control d'erreur du CAN */
  const uint16_t codeErreur = CAN.begin(reglages,[] {CAN.isr(); }, masque, filtres, 1 );
//   const uint16_t codeErreur = CAN.begin(reglages, [] { CAN.isr(); });
     
  if (codeErreur == 0) {
    Serial.println("configuration ok"); }
    else {
    Serial.println("Probleme de connexion");
    while (1);
    }
 }

//------------------------------LOOP------------------------//
  void loop()    { 
 
  CAN.dispatchReceivedMessage();

// ------- tempo affichage print ---------------------
 unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Serial.println( "--- test valeur CAN ----");
    Serial.print(T1);
    Serial.print( " deg : capteur A: % ");
    Serial.println(H1);
    Serial.println( " ------------------- ");
    Serial.print(T2);
    Serial.print( " deg : capteur B: % ");
    Serial.println(H2);
    }
  }
   
// -------------- fin Pgm -------------------

« Modifié: avril 24, 2022, 09:59:54 am par JeeLet »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3038
  • 100% Arduino et N
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #24 le: avril 22, 2022, 01:42:18 pm »
Il y a au moins deux possibilités:
Un Time-out (Pas de réponse après un certain temps).
Ou un échange avec un message de service décrivant l’état de l’émetteur,
Et sans doute les deux.

Svp: utilisez le bouton “Modifier” pour éliminer les fautes ou mieux formuler une question.
« Modifié: avril 22, 2022, 01:43:50 pm par Dominique »
Cordialement,
Dominique

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #25 le: avril 22, 2022, 02:10:35 pm »
Dominique merci pour le début de piste.

Mais je pensais que la librairie ACAN avait déjà une instruction, une fonction, pour ce genre de défaut?

 je vais fouiller encore sur les exemples de pierre Molinaro, voir comment.

  sinon "Un Time-out (Pas de réponse après un certain temps)." comment l’appliqué :(

“Modifier”  .. c'est bon :)
« Modifié: avril 22, 2022, 02:14:20 pm par JeeLet »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #26 le: avril 22, 2022, 02:14:24 pm »
Bonjour,

ACAN ignorant le contenu des messages, elle ne peut pas décider de valeur par défaut en cas de timeout

Pour faire un timeout il faut :

  • Une variable qui reçoit la date courante (millis()) lorsqu'une donnée est reçue
  • Un test dans loop qui compare la date courante moins la variable à une délai. Si le délai est dépassé, la donnée est mise à la valeur par défaut (0 ici)

Ça suppose évidemment que la réception (et donc l'envoi) est périodique.
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #27 le: avril 22, 2022, 03:14:52 pm »
Autant je pensais avoir compris le problème, autant je ne comprends plus rien maintenant.

Deux contrôleurs CAN ne maintiennent pas une connexion, l'émetteur se contente d'envoyer des trames et le récepteur de les recevoir. En l'absence d'un envoi de trame, il n'y a aucun moyen pour le récepteur de savoir que l'émetteur n'est plus là. C'est pas du TCP/IP.

Donc c'est à l'application de gérer l'absence de réception.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3038
  • 100% Arduino et N
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #28 le: avril 22, 2022, 07:02:40 pm »
C’est à vous de définir (inventer) votre message de service.
Cordialement,
Dominique