Bonjour à tous,
Afin d'utiliser le CRC16 modbus pour un projet, je souhaite convertir le code C suivant en python :
Pour cela, j'ai essayé 2 méthodes,Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 short Crc16(unsigned char *Adresse_tab , unsigned char Taille_max) { unsigned int Crc = 0xFFFF; unsigned int Polynome = 0xA001; unsigned int CptOctet = 0; unsigned int CptBit = 0; unsigned int Parity= 0; Crc = 0xFFFF; Polynome = 0xA001; for ( CptOctet= 0 ; CptOctet < Taille_max ; CptOctet++) { Crc ^= *( Adresse_tab + CptOctet); for ( CptBit = 0; CptBit <= 7 ; CptBit++) { Parity= Crc; Crc >>= 1; if (Parity%2 == true) Crc ^= Polynome; } } return(Crc); }
1ère méthode, j'essaye de faire un tableau mais je pense qu'il n'y a pas d'équivalent python... :
2ème méthode, je met plusieurs boucles "for" :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Crc = 0xFFFF Polynome = 0xA001 CptOctet = 0 CptBit = 0 Parity= 0 def Crc16(*Adresse_tab , Taille_max): for (CptOctet= 0 , CptOctet < Taille_max , CptOctet++): Crc ^= *( Adresse_tab + CptOctet) for ( CptBit = 0; CptBit <= 7 ; CptBit++): Parity= Crc Crc >>= 1 if (Parity%2 == true) Crc ^= Polynome return(Crc) print(Crc)
Etant débutant je demande votre aide car je n'ai rien trouvé sur internet,Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 crc=0xFFFF polynome = 0xA001 cptoctet = 0 cptbit=0 parity=0 Crc = 0xFFFF Polynome = 0xA001 # Polynôme = 2^15 + 2^13 + 2^0 = 0xA001. for CptOctet= 0: for CptOctet < Taille_max : for CptOctet++: Crc ^ ( Adresse_tab + CptOctet) #Ou exculsif entre octet message et CRC for CptBit = 0: for CptBit <= 7 : for 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)
La librairie crc16 existante sur internet ne donne pas le bon CRC16 :
en effet elle donne le crc16 xmodem et je souhaite le crc16 modbus/jbus :Code:print (crc16.crc16xmodem(b'\x07\xe0\x01\xe0\x01\xfb'))
Exemple: pour 0x07, 0xe0, 0x01, 0xe0, 0x01, 0xbb => le CRC16 modbus est = à 0xc1, 0x93.
Merci :)
Mel-c