Bonjour à tous,
Afin d'utiliser le CRC16 modbus pour un projet, je souhaite convertir le code C suivant en python :
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);
} |
Pour cela, j'ai essayé 2 méthodes,
1ère méthode, j'essaye de faire un tableau mais je pense qu'il n'y a pas d'équivalent python... :
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) |
2ème méthode, je met plusieurs boucles "for" :
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) |
Etant débutant je demande votre aide car je n'ai rien trouvé sur internet,
La librairie crc16 existante sur internet ne donne pas le bon CRC16 :
print (crc16.crc16xmodem(b'\x07\xe0\x01\xe0\x01\xfb'))
en effet elle donne le crc16 xmodem et je souhaite le crc16 modbus/jbus :
Exemple: pour 0x07, 0xe0, 0x01, 0xe0, 0x01, 0xbb => le CRC16 modbus est = à 0xc1, 0x93.
Merci 
Mel-c
Partager