CRC en protocle MODBUS

Fermé
tout_fou
Messages postés
95
Date d'inscription
samedi 20 mars 2004
Statut
Membre
Dernière intervention
10 mai 2009
- 15 mai 2005 à 10:26
 bogossEvreux - 27 mai 2005 à 23:49
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

crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
506
15 mai 2005 à 12:45
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
bogossEvreux
27 mai 2005 à 23:49
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