Verif CRC16

cs_sena Messages postés 126 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 15 février 2005 - 14 mai 2003 à 16:33
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 14 déc. 2009 à 23:54
Bonjour,

voila j'ai un pti prog pour calculer le CRC16.
Je voudrai savoir si kelkun pouvait me dire si ce code fonctionne merci. Car je n'ai qu'un seul exemple pour vérifier ...

Donc si kelkun avait un autre code ou bien si kelkun veut bien regarder ce code qui suit, ca me permettrai de savoir si ce calcul de CRC16 est correct.
C'est très important.

#define NUMDATA 2
// 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] );
}

return 0;
}

Merci beaucoup beaucoup beaucoup.
Sena

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mai 2003 à 16:38
const DWORD crc32_table[] = {
0UL, 16777216UL, 33554432UL, 50331648UL, 67108864UL, 83886080UL, 100663296UL,
117440512UL, 134217728UL, 150994944UL, 167772160UL, 184549376UL, 201326592UL, 218103808UL,
234881024UL, 251658240UL, 268435456UL, 285212672UL, 301989888UL, 318767104UL, 335544320UL,
352321536UL, 369098752UL, 385875968UL, 402653184UL, 419430400UL, 436207616UL, 452984832UL,
469762048UL, 486539264UL, 503316480UL, 520093696UL, 536870912UL, 553648128UL, 570425344UL,
587202560UL, 603979776UL, 620756992UL, 637534208UL, 654311424UL, 671088640UL, 687865856UL,
704643072UL, 721420288UL, 738197504UL, 754974720UL, 771751936UL, 788529152UL, 805306368UL,
822083584UL, 838860800UL, 855638016UL, 872415232UL, 889192448UL, 905969664UL, 922746880UL,
939524096UL, 956301312UL, 973078528UL, 989855744UL, 1006632960UL, 1023410176UL, 1040187392UL,
1056964608UL, 1073741824UL, 1090519040UL, 1107296256UL, 1124073472UL, 1140850688UL, 1157627904UL,
1174405120UL, 1191182336UL, 1207959552UL, 1224736768UL, 1241513984UL, 1258291200UL, 1275068416UL,
1291845632UL, 1308622848UL, 1325400064UL, 1342177280UL, 1358954496UL, 1375731712UL, 1392508928UL,
1409286144UL, 1426063360UL, 1442840576UL, 1459617792UL, 1476395008UL, 1493172224UL, 1509949440UL,
1526726656UL, 1543503872UL, 1560281088UL, 1577058304UL, 1593835520UL, 1610612736UL, 1627389952UL,
1644167168UL, 1660944384UL, 1677721600UL, 1694498816UL, 1711276032UL, 1728053248UL, 1744830464UL,
1761607680UL, 1778384896UL, 1795162112UL, 1811939328UL, 1828716544UL, 1845493760UL, 1862270976UL,
1879048192UL, 1895825408UL, 1912602624UL, 1929379840UL, 1946157056UL, 1962934272UL, 1979711488UL,
1996488704UL, 2013265920UL, 2030043136UL, 2046820352UL, 2063597568UL, 2080374784UL, 2097152000UL,
2113929216UL, 2130706432UL, 2147483648UL, 2164260864UL, 2181038080UL, 2197815296UL, 2214592512UL,
2231369728UL, 2248146944UL, 2264924160UL, 2281701376UL, 2298478592UL, 2315255808UL, 2332033024UL,
2348810240UL, 2365587456UL, 2382364672UL, 2399141888UL, 2415919104UL, 2432696320UL, 2449473536UL,
2466250752UL, 2483027968UL, 2499805184UL, 2516582400UL, 2533359616UL, 2550136832UL, 2566914048UL,
2583691264UL, 2600468480UL, 2617245696UL, 2634022912UL, 2650800128UL, 2667577344UL, 2684354560UL,
2701131776UL, 2717908992UL, 2734686208UL, 2751463424UL, 2768240640UL, 2785017856UL, 2801795072UL,
2818572288UL, 2835349504UL, 2852126720UL, 2868903936UL, 2885681152UL, 2902458368UL, 2919235584UL,
2936012800UL, 2952790016UL, 2969567232UL, 2986344448UL, 3003121664UL, 3019898880UL, 3036676096UL,
3053453312UL, 3070230528UL, 3087007744UL, 3103784960UL, 3120562176UL, 3137339392UL, 3154116608UL,
3170893824UL, 3187671040UL, 3204448256UL, 3221225472UL, 3238002688UL, 3254779904UL, 3271557120UL,
3288334336UL, 3305111552UL, 3321888768UL, 3338665984UL, 3355443200UL, 3372220416UL, 3388997632UL,
3405774848UL, 3422552064UL, 3439329280UL, 3456106496UL, 3472883712UL, 3489660928UL, 3506438144UL,
3523215360UL, 3539992576UL, 3556769792UL, 3573547008UL, 3590324224UL, 3607101440UL, 3623878656UL,
3640655872UL, 3657433088UL, 3674210304UL, 3690987520UL, 3707764736UL, 3724541952UL, 3741319168UL,
3758096384UL, 3774873600UL, 3791650816UL, 3808428032UL, 3825205248UL, 3841982464UL, 3858759680UL,
3875536896UL, 3892314112UL, 3909091328UL, 3925868544UL, 3942645760UL, 3959422976UL, 3976200192UL,
3992977408UL, 4009754624UL, 4026531840UL, 4043309056UL, 4060086272UL, 4076863488UL, 4093640704UL,
4110417920UL, 4127195136UL, 4143972352UL, 4160749568UL, 4177526784UL, 4194304000UL, 4211081216UL,
4227858432UL, 4244635648UL, 4261412864UL, 4278190080UL };

DWORD __stdcall Crc32(BYTE *buffer, BYTE *buffer_end)
{
DWORD crc = 0xFFFFFFFF;
while(buffer < buffer_end)
crc = (crc >> 8) ^ crc32_table[(crc ^ *buffer++) & 0xFF];
return crc;
}

T'excuseras, j'ai que du 32.
BruNews, ciao...
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
14 mai 2003 à 17:06
c'est quoi le CRC ? Ou je peut trouver de la doc?
Hart
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mai 2003 à 17:14
Sert a enregistrer une valeur de controle d'integrite, surtout employe dans la compression, decoupage. Partout ou tu veux controler que donnees obtenues sont conformes a donnees originales.
Pour ce faire on parcourt le buffer dans un algo qui te donne un resultat.
BruNews, ciao...
0
pupucelud Messages postés 1 Date d'inscription jeudi 23 septembre 2004 Statut Membre Dernière intervention 23 septembre 2004
23 sept. 2004 à 15:27
Ca ressemble à l'algorithme utilisé pour le calcul du CRC dans les trames Modbus et autres...
Voici le mien (fonctionne parfaitement, validé avec plusieurs automates programmables industriels) :

unsigned short CalcCRC( unsigned char * message, int l )
{
unsigned short crc = 0xFFFF;

for ( ; l--; )
{
crc ^= * ( message++ );
for ( SHORT j = 8; j--; )
{
if ( crc & 1 )
crc = ( crc >> 1 ) ^ 0xA001;
else
crc >>= 1;
}
}
return( crc );
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tligmohamed Messages postés 1 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 14 décembre 2009
14 déc. 2009 à 23:08
chaqu'un a propre methode de calcul de crc
donc je vous dit de faire attention de ne plus perdre votre temps dans des details que vous n'aidez pas
bonne chance
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
14 déc. 2009 à 23:54
Salut,
Bienvenue sur Codes-Sources. Je t'informe juste que tu es en retard de 6ans (le topic date de 2003)


Cordialement, uaip.
0
Rejoignez-nous