IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

CRC16 python 3.2


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut CRC16 python 3.2
    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

  2. #2
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut Algo
    Un algo existe sur le net mais je n'arrive pas à le traduire

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Donc, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    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)
    ... ce serait du Python !

    L'effort est louable, mais Python c'est en fait un peu plus simple que cela. (et surtout plus esthétique)

    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
     
    Crc = 0xFFFF
    Polynome = 0xA001
    CptOctet = 0
    CptBit = 0
    Parity= 0
     
    def crc16(addr , size):
        for i in range(0, size):
            Crc ^= addr + i
            for j in range(0, 7):
                Parity = Crc
                Crc >>= 1  # FIXME c'est quoi ça: >>= ?
                if not Parity % 2:
                    Crc ^= Polynome
        return(Crc)
    Le reste découle de ce qui précède.

  4. #4
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut Encore une petite question stp
    Merci pour ta réponse rapide, cepandant j'ai encore une petite question..

    J'ai essayé ce code, je reçois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> 
    65535
    40961
    0
    0
    0
    >>>
    ...
    Aussi, je ne sais pas où mettre la chaine de carractères [0x07,0xe0,0x01,0xe0,0x01,0xfb]... addr, size ?

    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
    Crc = 0xFFFF
    Polynome = 0xA001
    CptOctet = 0
    CptBit = 0
    Parity = 0
     
    addr = bytes([0x07,0xe0,0x01,0xe0,0x01,0xfb])
    size=65535
     
    def crc16(addr , size):
        for CptOctet in range(0, size):
            Crc ^ addr + CptOctet
            for CptBit in range(0, 7):
                Parity = Crc
                Crc >>= 1  # FIXME c'est quoi ça: >>= ?
                if Parity % 2:
                    Crc ^ Polynome
            return(Crc)
     
    print(Crc)
    print(Polynome)
    print(CptOctet)
    print(CptBit)
    print(Parity)
    Le code C que j'avais récupérer est dispo en toute fin de la doc suivante :
    http://www.wifibot.com/download/2012...rotocol_V4.pdf

    J'avais oublié de mettre le lien d'algo pour le message precedent...
    Celui-ci permet de trouver le CRC16 souhaité.
    http://sitelec.org/cours/abati/flash/crc16.swf

    Mel-c

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Il existe un module tout fait pour cela.

    Regarde ici:
    https://pypi.python.org/pypi/crc16/0.1.1

    Si tu as des difficultés à l'installer ou l'utiliser tu le dis.

Discussions similaires

  1. [langage] traduction d'un fonction python en perl
    Par ay_pepito dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2007, 15h06
  2. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  3. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51
  4. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo