Bonjour à tous,
Afin d'utiliser le CRC16 modbus pour un projet, je souhaite convertir le code C suivant en python :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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... :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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