Crc 16

Soyez le premier à donner votre avis sur cette source.

Snippet vu 30 181 fois - Téléchargée 30 fois

Contenu du snippet

Cette source permet de Calculer le CRC16 ou <Contrôle de redondance cyclique> d'un Tableau selon le Polynome 0xA001 en accord avec le protocol JBUS.

Source / Exemple :


Auteur : VirtuA 

unsigned int Crc16(unsigned char *Adresse_tab , unsigned char Taille_max)	
{																
unsigned int Crc = 0xFFFF;
unsigned int Polynome = 0xA001; 
unsigned char CptOctet = 0;
unsigned char CptBit = 0;
unsigned char 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);
}

Conclusion :


La fonction renvoie un INT ( CRC16 sur 2 octets ).

Un petit soft complet réalisé en C++ sera disponible sur mon site perso
http://www.virtuanet.fr.st

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
vendredi 27 octobre 2006
Statut
Membre
Dernière intervention
10 décembre 2007

salut j'ai essayé le prog , mais ca donne pas le bon resultat:
est ce que la taille max correspond bien a la taille de la trame sans le CRC?

trame: 04.03.00.02.00.01
le CRC doit etre: 25.CA
alors moi je trouve pas le meme resultat.
j'ai mis Taille_max=6.
est ce que le prob est dans le prog , ou bien j'ai mal utilisé le prog????
merci pour votre reponse .
Messages postés
15
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
29 août 2006

Re j'ai trouvé ce site :
http://titicoco.chez-alice.fr/modbus.html#ancre32233

Ou l'exemple du Jbus est pour 0207 le résultat doit donner 1241 mais comme lors de l'envoi on enverse le CRC ca donne 4112.


++
Messages postés
15
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
29 août 2006

c'est que la valeur envoyer doit être mal calculée...
dans la doc Jbus il y a un exemple de trame et cette fonction donne le bon résultat.

-elle donne le même résultat que la:
http://www.vbfrance.com/codes_image/normal/2657.aspx

++
Messages postés
20
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
14 septembre 2006

Bonjour,

Désolé de mettre un commentaire tardif sur cette fonction mais je ne tombe pas sur le bon CRC dans mon protocole MODBUS. Avec cette fonction la valeur est presque bonne mais pas tout à fait juste. En Utilisant d'autres codes, je tombe sur les bonnes valeurs...

A vous de voir.
Gwen
Messages postés
105
Date d'inscription
samedi 7 décembre 2002
Statut
Membre
Dernière intervention
17 août 2009

unsigned int c'est du 32 bits, pour 16 bits unsigned short suffit.
Sinon très sympa ton code : 8/10
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.