CRC en protocle MODBUS
tout_fou
Messages postés
96
Statut
Membre
-
bogossEvreux -
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
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
A voir également:
- {"Error_type": "oauthexception", "code": 400, "error_message": "session invalid"}
- Echec de crc - Forum Windows
- Protocle http - Guide
- Marre des erreurs CRC !!! - Forum Réseaux sociaux
- RS485/ModBus - Forum Programmation
- CRC - Forum CISCO
1 réponse
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.
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.
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;
}