Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment extraire les données du bus CAN ?

    16 novembre 2020 à 15:19:05

    Bonjour , 

    j'ai connecté avec un shield can et un arduino,

    voici ce que j'ai sur le moniteur série:

    Entering Configuration Mode Successful!
    Setting Baudrate Successful!
    MCP2515 Initialized Successfully!
    MCP2515 Library Receive Example...
    Standard ID: 0x5D7       DLC: 7  Data: 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008
    Standard ID: 0x080       DLC: 0  Data:
    Standard ID: 0x436       DLC: 6  Data: 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008
    Standard ID: 0x155       DLC: 8  Data: 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008
    Standard ID: 0x59B       DLC: 8  Data: 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008

    voici le script de l'arduino:

    #include <mcp_can.h>
    #include <SPI.h>
    
    long unsigned int rxId;
    unsigned char len = 0;
    unsigned char rxBuf[8];
    char msgString[128];                        // Array to store serial string
    
    #define CAN0_INT 2                              // Set INT to pin 2
    MCP_CAN CAN0(10);                               // Set CS to pin 10
    
    
    void setup()
    {
      Serial.begin(115200);
      
      // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
      if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
        Serial.println("MCP2515 Initialized Successfully!");
      else
        Serial.println("Error Initializing MCP2515...");
      
      CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
    
      pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
      
      Serial.println("MCP2515 Library Receive Example...");
    }
    
    void loop()
    {
      if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
      {
        CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
        
        if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
          sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
        else
          sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
      
        Serial.print(msgString);
      
        if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
          sprintf(msgString, " REMOTE REQUEST FRAME");
          Serial.print(msgString);
        } else {
          for(byte i = 0; i<len; i++){
            sprintf(msgString, " 0x%.2X", rxBuf[i]);
            Serial.print(msgString);
          }
        }
            
        Serial.println();
      }
    }

    Qu'est ce que je peux faire avec ces données ??

    par exemple celui ci:

    Standard ID: 0x155       DLC: 8  Data: 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008 0x1008

    je suppose que à l'adresse x155 il y a des données à récupérer que c'est juste l'adresse d'une référence ?

    qu'il faut que dans la boucle de lecture il faut extraire les donnée  de cette adresse 0x1008 ?

    merci de vos réponses



    -
    Edité par keo 16 novembre 2020 à 15:19:52

    • Partager sur Facebook
    • Partager sur Twitter
    projet de création domotique avec beaglebone avec nodejs
      16 novembre 2020 à 20:09:11

      Personne ne peut répondre à ton problème en l'état vu qu'on ne sait rien du système sur lequel le bus est implémenté, ni des nœuds qui sont connectés sur le bus.

      Donne-nous des précisions sur le système, renseigne-toi sur les nœuds connectés et les données qu'il sont sensés échanger ainsi que sur la valeur de leur ID et on pourra avancer.

      PS: il doit y avoir un problème avec l'affichage des données: une trame CAN ne peut transporter que 8 octets. On voit d'ailleurs que le DLC est à 8, ce qui signifie que la trame transporte 8 octets. Or tu relèves 8 fois 0x1008, ce qui correspond à au moins 16 octets. Il y a un problème.

      -
      Edité par zoup 16 novembre 2020 à 20:11:47

      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2020 à 11:03:44

        merci zoup,

        alors voici le matériel que j'ai connecté:

        arduino uno + shield ( https://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/)

        de l'autre coté c'est ECU de la twizy.

        Pour le moment mon but est de filtré un "ID"

        voici ce que j'ai modifier sur le code:

                       Serial.print("-->");
            //if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
               if((rxId & 0x40000000) == 0x155){    // Determine if message is a remote request frame.
              sprintf(msgString, " REMOTE REQUEST FRAME");
              Serial.print(msgString);
            } else {
              for(byte i = 0; i<len; i++){
        
                sprintf(msgString, " 0x%.2X", rxBuf[i]);
                Serial.print(msgString);
              }
            }
                
            Serial.println();

        voici ce que j'ai:

        Standard ID: 0x080       DLC: 0  Data:-->
        Standard ID: 0x628       DLC: 3  Data:--> 0x00 0x00 0x00
        Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
        Standard ID: 0x5D7       DLC: 7  Data:--> 0x00 0x00 0x07 0xA4 0x8C 0x00 0x00
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        Standard ID: 0x196       DLC: 8  Data:--> 0x00 0xFF 0xE7 0x7F 0x70 0x38 0x0B 0x00
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        Standard ID: 0x155       DLC: 8  Data:--> 0x07 0x97 0xCE 0x54 0x5D 0x30 0x00 0x6D
        

        je n'ai pas réussi à flitrer juste le ID = 0&155

        pour le moment c'est juste pour m'habituer au C


        • Partager sur Facebook
        • Partager sur Twitter
        projet de création domotique avec beaglebone avec nodejs
          17 novembre 2020 à 21:37:15

          Je ne connais pas ta bibliothèque.

          A quoi correspond exactement rxId?

          J'ai tendance à penser qu'il s'agit de l'ID du noeud, mais je ne comprends pas pourquoi ce ET avec 0x40000000. Ca fait 4 octets, or un ID de 32 bits, c'est assez curieux.

          • Partager sur Facebook
          • Partager sur Twitter

          comment extraire les données du bus CAN ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown