Mode RTU :
Adresse du début
(décompte par
CRC CHK Low
CRC CHK High
La CRC (vérification cyclique redondante) est calculée par les étapes suivantes :
Étape 1 : Chargement d'un registre de 16 bits (appelé le registre CRC) avec FFFFH.
Étape 2 : OR exclusif du premier octet du message de commande à 8 bits avec l'ordre bas du registre CRC
de 16 bits, en mettant le résultat dans le registre CRC.
Étape 3 : Examiner le registre LSB de CRC.
Étape 4 : Si le registre LSB de CRC est 0, décale le registre CRC d'un bit vers la droite en remplissant MSB
de zéros, puis répète l'étape 3. Si le registre LSB de CRC est 1, décale le registre CRC d'un bit vers la droite
en remplissant MSB de zéros, OU exclusif pour le registre CRC avec valeur polynomiale A001H, puis répète
l'étape 3.
Étape 5 : Répète les étapes 3 et 4 jusqu'à 8 décalages. Ensuite, un octet complet de 8 bits a été traité.
Étape 6 : Répète les étapes 2 à 5 pour les 8 prochains bits du message de commande. Continue ainsi
jusqu'à ce que tous les octets soient traités. Les contenus finaux du registre CRC correspondent à la valeur
CRC. Lors de la transmission de la valeur CRC dans le message, les octets supérieurs et inférieurs de la
valeur CRC sont échangés, ainsi les octets inférieurs sont transmis en premier.
Vous trouvez ci-après un exemple de la génération CRC à l'aide du langage C. La fonction exige deux
arguments :
Unsigned char* data un pointeur vers le tampon du message
Unsigned char length la quantité d'octets dans le tampon du message
La fonction retourne la valeur CRC de type integer unsigned.
Unsigned int crc_chk(unsigned char* data, unsigned char length){
int j;
unsigned int reg_crc=0xFFFF;
while(length--){
reg_crc ^= *data++;
for(j=0;j<8;j++){
if(reg_crc & 0x01){ /* LSB(b0)=1 */
reg_crc=(reg_crc>>1) ^ 0xA001;
}else{
reg_crc=reg_crc >>1;
}
}
}
return reg_crc;
}
Révision mai 2014, 4ELE, V1.12
Adresse
01H
Fonction
03H
21H
de la donnée
02H
Nombre de
00H
données
02H
mot)
6FH
F7H
4-77