Salut a tous,
G un gros probleme je travail avec des trames Modbus seul probleme je dois calculer le CRC16 g trouver des algorithmes et des trames deja faite. Malheureusement les algorithme et codes trouver ne me fournisse pas le meme résultat que celui de la trames voici un algorithme et un code:
Initialiser le CRC (registre de 16 bits)
à H'FFFF
Faire du 1er octet du message au dernier
CRC X0R < octet > CRC
Faire 8 fois
Décaler le CRC d'un bit à droite
Si le bit de sorti = 1, faire CRC X0R H'A001 CRC
Fin faire.
Fin faire
Le CRC obtenu sera émis poids faibles d'abord, poids forts ensuite.
X0R signifie OU exclusif.
(
[ Lien ] )
Auteur : VirtuA
unsignedint Crc16(unsignedchar *Adresse_tab , unsignedchar Taille_max)
{
unsignedint Crc = 0xFFFF;
unsignedint Polynome = 0xA001;
unsignedchar CptOctet = 0;
unsignedchar CptBit = 0;
unsignedchar Parity= 0;
Crc = 0xFFFF;
Polynome = 0xA001; // Polynôme = 2^15 + 2^13 + 2^0 = 0xA001.
for ( CptOctet= 0 ; CptOctet < Taille_max ; CptOctet++)
{
Crc ^= *( Adresse_tab + CptOctet); //Ou exculsif entre octet message et CRC
for ( CptBit = 0; CptBit <= 7 ; CptBit++) /* Mise a 0 du compteur nombre de bits */
{
Parity= Crc;
Crc >>= 1; // Décalage a droite du crc
if (Parity%2 == VRAI) Crc ^= Polynome; // Test si nombre impair -> Apres decalage à droite il y aura une retenue
} // "ou exclusif" entre le CRC et le polynome generateur.
}
return(Crc);
}
(http://www.cppfrance.com/codes/CRC-16_31553.aspx)
La trame qui a ete recu est la suivante : 0403 0002 0001 25CA
et le resultat de ce code est A043 au lieu de 25CA
Pouvez vous maider je ne trouve pas la solution a ce probleme car le calcul effectuer dans le code me parait juste.