CRC en protocle MODBUS

tout_fou Messages postés 96 Statut Membre -  
 bogossEvreux -
Salut,
dans mon projet informatique, j'utilise le protocole MODBUS,
je dois coder une fonction qui calcul le CRC de la trame, j'ai trouver l'algoritme (voir au lien suivant ) :
http://stielec.ac-aix-marseille.fr/cours/abati/modbus.htm

Mon probleme est que j en ecomprend pas pouquoi a un moment on fait un OU exclusif entre le CRC et la valeure $A001 .

POuvez vous me l'expliquer.

merci d'avance

SEB

1 réponse

  1. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    A001 c'est le polynome générateur pour le calcul du CRC. Plus d'info
    http://www.cours-info.net/index.php/2005/04/24/3-le-crc---cyclic-redondant-coding
    Sinon google te renvoit sur pas mal de page en français qui cause du CRC,
    et en particulier pour le MODBUS.
    1
    1. bogossEvreux
       
      tiens sa va surement t'aider sa. moi ausi je fait un projet en info. je doit communiquer avec un automate schneider. mais j'ai un probleme j'arrive pa a mettre en forme la tram pour l'envoyer correctement si tu sais commen faire ya mon mail tu pe me repondre merci.
      au passage le code est en C.


      #include <stdio.h>
      #define NUMDATA 1


      // Calcul de CRC16
      unsigned int calcul_CRC16(unsigned int crc, unsigned int data)
      {
      const int Poly16=0xA001;
      int flag, i;

      crc = (crc^data); //XOR

      for (i=0; i<8; i++)
      {
      flag=(crc & 0x0001);//On récupère le dernier bit
      crc=crc/2; //décalage a droite, pas de 1
      if (flag) //Si le dernier bit vaut 1
      crc=crc^Poly16; //alors on fait un Xor avec Poly16
      }

      return(crc);
      }


      int main()
      {
      char data[NUMDATA];
      int Crc;

      data[0] = 0x02;
      data[1] = 0x07;

      Crc=0xFFFF;

      for (int i=0; i<NUMDATA; i++)
      {
      Crc = calcul_CRC16(Crc, data[i] );
      printf("%d",Crc);
      }

      return 0;
      }
      0