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 Réseaux sociaux
- Echec CRC dans le fichier crypte - Forum Windows
- RS485/ModBus - Forum Programmation
- CRC - Forum CISCO
- Erreur de CRC ✓ - Forum Matériel & Système
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;
}