Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Besoin d'aide! Crc16




  1. #1
    Mxtroll04

    Besoin d'aide! Crc16

    Bonjour je suis élèves de terminale S SI, en projet je suis chargé de la partie transmission de donnée. Le But est d'envoyer une chaîne de caractères quelconque d'arduino à arduino. Le problème est de vérifier si il y a une perte de donné pour cela j'utilise le CRC16. Je me tourne vers vous car je suis très en retard jai du mal en programmation donc j'aimerais qu'une personne maide pour faire un programme en c permettant de Calculer le CRC.

    Voilà ce que je veux convertir en C :
    Variable:
    a:chaîne de caractère
    P: polynone générateur
    c:résultat du crc
    M:message à envoyer
    Début
    Afficher"saisi chaîne de caractère "
    Lire a
    Convertir a en binaire
    P=10011
    Tant qu'il y a des données,incrémenter dans à
    effectuer un décalage à gauche de 1 bit (via l'opérateur <<)
    Si bit de poid fort =1
    Faire XOR Entre a et p=c
    Sinon décaler de 1 vers la gauche
    Fins
    Fin tant que
    M= a+c
    Fin

    -----


  2. Publicité
  3. #2
    Ikhar84

    Re : Besoin d'aide! Crc16

    Salut,

    C'est pas le bon site si tu souhaites qu'on traduise ton algo en C à ta place !

    Par contre tu peux présenter ici ton code er il sera commenté et même sûrement corrigé si nécessaire... à moins que quelqu'un se dévoue...
    J'ai glissé Chef !

  4. #3
    PA5CAL

    Re : Besoin d'aide! Crc16

    Bonsoir

    Tout d'abord, concernant les exercices et projets scolaires, dont la finalité est d'évaluer les étudiants ou de inculquer des connaissances et des savoir faire de base, ici on ne fait pas le travail à la place des intéressés. Les règles du forum sont rappelées par ici.

    Ensuite, avant de poser leur question sur le forum, les demandeurs sont priés de commencer par faire une cherche sur Internet. En l'occurrence, on y trouve déjà de très nombreuses réponses, ce qui ôte a priori tout intérêt qu'un contributeur perde son temps à en écrire une autre. De plus, s'agissant plus particulièrement d'Arduino, le projet fournit par défaut un calcul de CRC16, et on trouve des bibliothèques compatibles qui en proposent d'autres.

    Enfin, la question est imprécise. Il existe plusieurs CRC16, avec des polynômes générateurs, des bases et des modes d'utilisation différents. Il faudrait au minimum se demander lequel on doit mettre en œuvre.
    Dernière modification par PA5CAL ; 15/01/2019 à 19h27.


  5. #4
    polo974
    Daudet, tu vas nous manquer...

  6. #5
    PA5CAL

    Re : Besoin d'aide! Crc16

    Même s'il manque certaines précisions à l'algorithme donné dans le sujet, il me semble que le polynôme générateur de celui-ci (0x8005, soit x16+x15+x2+1) ne correspond pas à « P=10011 » (quelle que soit la façon de d'interpréter cette valeur).

  7. A voir en vidéo sur Futura
  8. #6
    albanxiii

    Re : Besoin d'aide! Crc16

    Bonjour,

    Citation Envoyé par Mxtroll04 Voir le message
    Je me tourne vers vous car je suis très en retard jai du mal en programmation donc j'aimerais qu'une personne maide pour faire un programme en c permettant de Calculer le CRC.
    Vous payez comment, en espèce, chèque, bitcoin ?
    Not only is it not right, it's not even wrong!

  9. #7
    Nobody91

    Re : Besoin d'aide! Crc16

    Bon 2s de recherche sur google:
    Code:
    #define POLY 0x8408
    /*
    //                                      16   12   5
    // this is the CCITT CRC 16 polynomial X  + X  + X  + 1.
    // This works out to be 0x1021, but the way the algorithm works
    // lets us use 0x8408 (the reverse of the bit pattern).  The high
    // bit is always assumed to be set, thus we only use 16 bits to
    // represent the 17 bit value.
    */
    
    unsigned short crc16(char *data_p, unsigned short length)
    {
          unsigned char i;
          unsigned int data;
          unsigned int crc = 0xffff;
    
          if (length == 0)
                return (~crc);
    
          do
          {
                for (i=0, data=(unsigned int)0xff & *data_p++;
                     i < 8; 
                     i++, data >>= 1)
                {
                      if ((crc & 0x0001) ^ (data & 0x0001))
                            crc = (crc >> 1) ^ POLY;
                      else  crc >>= 1;
                }
          } while (--length);
    
          crc = ~crc;
          data = crc;
          crc = (crc << 8) | (data >> 8 & 0xff);
    
          return (crc);
    }
    J'ai pas vérifié mais cela me semble pas mal; si tu as des questions...
    Dernière modification par JPL ; 17/01/2019 à 22h56. Motif: Ajout de la balise Code (#) pour garder l'indentation

  10. Publicité
  11. #8
    Mxtroll04

    Cool Re : Besoin d'aide! Crc16

    Bonjour, merci de votre aide
    je tenai a vous dire que je ne demande pas qu'une personne me le fait mais plutot qu'elle m'aide.
    Voila mon programme que j'ai écrit mais il ne fonctionne pas:

    Code:
    #include <stdint.h>
    #include <stdio.h>
    
    int main()
    {
        prinft("rentrer la chaine binaire ? ");
        // message qui sera utuliser dans la division
        CHAR_BIT("%m", message)
        int crc=10011
        }
        {
            int ByteCnt = 8;
        //--- Stocker la nouvelle valeur a la fin
            message = Byte;
        //--- Test des bit du Byte
            do{
            message<<=1;
            if (message & 1)
            message^crc=d;
            } while (--message)
        }
        printf("%m", d)
    }
    POUVEZ VOUS M'AIDEZ A LE CORRIGER?
    Dernière modification par gienas ; 23/01/2019 à 11h19. Motif: Ajouté les balises code obligatoires pour les programmes

  12. #9
    PA5CAL

    Re : Besoin d'aide! Crc16

    Déjà, ce programme n'est pas compilable, car sa syntaxe n'est pas conforme au langage C.

    Pour rappel, les instructions doivent se terminer par un point-virgule (ou éventuellement être séparées par des virgules, pour des expressions à instructions multiples).

    Les fonctions, constantes et variables utilisées doivent être préalablement définies.

    « CHAR_BIT » n'est pas une fonction du langage. Généralement, cela représente juste le nombre de bit dans un type char, c'est-à-dire la valeur constante 8.

    Dans la ligne « message = Byte; », Byte n'a pas été défini dans le programme.

    Dans la boucle do/while, le test du bit de poids fort (« message & 1 ») est toujours faux, parce que le décalage qui le précède (« message <<= 1; ») le met toujours à zéro. Donc cette partie du code ne fait rien.

    Par ailleurs, la ligne « message^crc=d; » ne correspond pas à une opération valide. De plus, d n'est pas défini dans le programme.


    La moindre des choses serait d'apprendre les bases du langages C, ou au minimum de s'y référer. Le forum n'a pas vocation à se substituer à des cours ou à des documents de référence.

    Le codage consiste à traduire l'algorithme en utilisant les éléments du langage de programmation. Il faut donc comprendre a minima l'algorithme afin de le traduire correctement. Cela n'a visiblement pas été le cas ici.

    Une fois codé, un programme est compilé, et le compilateur génère des messages s'il détecte des erreurs. Dans le cas présent, la prise en compte de ces messages aurait déjà permis de désigner la majorité des erreurs que j'ai relevées, et donné des indications pour les corriger. Les contributeurs du forum ne sont pas là pour faire le travail d'un logiciel que tu peux utiliser tout seul.


    Bref, le code proposé ci-dessus apparaît comme de la pure fumisterie.

    En l'état, te donner le code corrigé reviendrait à faire tout ton travail. Alors, au boulot !
    Dernière modification par PA5CAL ; 23/01/2019 à 13h21.

  13. #10
    PA5CAL

    Re : Besoin d'aide! Crc16

    Oups. Il faut lire « ... le test du bit de poids faible ... »

  14. #11
    Nobody91

    Re : Besoin d'aide! Crc16

    Et je rajouterais qu'il manque un scanf pour entrer la valeur, que les accolades ne sont pas au bon endroit, que le %m du printf n'est pas du C, que int crc=10011 ne va pas te donner une valeur en binaire mais en entier, que pour message<<=1; le décalage est dans le mauvais sens...
    Comme on voit bien que tu ne maitrises pas le C , je te conseil plutôt de partir de l'exemple qui a été donné, de le compiler, de l’exécuter en pas à pas avec un débogueur pour comprendre comment il fonctionne et le modifier après pour coller à ton TP.

Sur le même thème :

Discussions similaires

  1. CRC16 One wire
    Par Tripic dans le forum Électronique
    Réponses: 2
    Dernier message: 19/04/2010, 21h16
  2. admission pour post-bac besoin aurait besoin d 'une grande aide svp
    Par Tima_caramel dans le forum Orientation avant le BAC
    Réponses: 0
    Dernier message: 24/02/2010, 14h53
  3. Réponses: 4
    Dernier message: 06/12/2008, 21h37