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

Arduino Discussion :

Arduino & CR16 sur bus série


Sujet :

Arduino

  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut Arduino & CR16 sur bus série
    Bonjour,

    Je suis tout nouveau dans le monde des Arduino et j'ai un projet lourd dans lequel je patauge amèrement.

    Je dois établir une connexion série type TTL entre deux cartes Arduino. Quelques tests sur base d'ascii m'a permis de validé le fait que ça fonctionnais.

    Depuis, le projet à pris un peu plus d'ampleur et je suis obliger de passer par des Octets du type 0x00 à 0xFF. Rien de bien méchant.

    C'est à ce niveau là que je bloque. J'ai entendu parlé mais j'ai pas trouver de documentations probante. J'ai peut-être pas les bons mots clefs aussi. Je recherche le fonctionnement du CR16 qui sert en checksum et qui sert en fin de transmission.

    Retenez que chaque trame est composé, dans le protocole que j'utilise de 3 à 5 octets suivi d'un octet de type CR16.

    Mes questions sont donc:
    - Quelle doc en français même condensé pour comprendre le CR16 ?
    - Comme s'implémente le CR16 dans une liaison série ?
    - Doit-on envoyer chaque octet avec un séparateur ?
    - Est-ce qu'il existe une liaison série fiable pour Arduino déjà codé sous format de lib à importe ?

    Je ne peux hélas que vous demander un peu de patience et de compréhension, moi qui débute dans ce petit monde de l'embarqué.

    Merci pour vos réponses, en espérant que ce ne soit pas histoire de devoir réinventer la roue. Restons simple concis et efficace.

    Cordialement

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 245
    Par défaut
    Citation Envoyé par Microbulle Voir le message
    Retenez que chaque trame est composé, dans le protocole que j'utilise de 3 à 5 octets suivi d'un octet de type CR16.
    Faux.
    CRC pour Cyclic Redundancy Check (Contrôle de redondance cyclique) est le reste de la division modulo 2 des données binaires à contrôler par le polynôme de calcul. Pour le CRC16, le reste sera obligatoirement de 16 bits donc 2 octets de CRC

    Citation Envoyé par Microbulle Voir le message
    - Quelle doc en français même condensé pour comprendre le CR16 ?
    La page wikipédia en français, mais la page anglosaxone est quand même bien plus complète
    Citation Envoyé par Microbulle Voir le message
    - Comme s'implémente le CR16 dans une liaison série ?
    Il ne s'implémente pas sur la liaison elle-même, mais se calcule en amont sur les données à transmettre (la totalité des données binaires en un seul mot et non pas octet par octet). Le résultat s'intègre à la fin de trame et devient banalement 2 octets supplémentaires à transmettre.

    Citation Envoyé par Microbulle Voir le message
    - Doit-on envoyer chaque octet avec un séparateur ?
    Faut voir avec ton protocole de dialogue. Généralement, dans les protocoles de dialogues, les trames contiennent au départ au moins, un identifiant de début de trame, une information de longueur, les données, le crc, éventuellement un identifiant de fin. Dans ce cas il n'y a pas besoin de séparateur, la longueur des données est connue, donc les 2 octets qui suivent (dans le cas simpliste que j'indique) sont donc forcément le crc.

    Citation Envoyé par Microbulle Voir le message
    - Est-ce qu'il existe une liaison série fiable pour Arduino déjà codé sous format de lib à importe ?
    Joker, je connais pas Arduino.

    Concernant les CRC, notamment le CRC16, tu peux prendre le polynôme que tu veux mais certains sont normalisés (voir tableau à la fin de la page wikipédia anglo-saxonne). Dans le cas présent, le polynôme doit t'être indiqué dans la doc de ton protocole de dialogue.

    Dans le cas de l'exemple de la page wikipédia anglo-saxonne (Computation of CRC), le CRC pris est un CRC3 (ordre 3 donc 4 bits).
    Le polynome est x³+x+1, donc 1*x³+0*x²+1*x+1 ou sous forme binaire 1011

    Pour calculer, il faut prendre la totalité des données binaires en un seul mot, rajouter autant de 0 de poids faible que la puissance la plus élevée du CRC (ici 3).
    Ensuite on applique la division modulo 2 de la donnée avec le polynôme, on ignore le quotient, on ne garde que le reste (revient aussi à répéter une addition bit à bit sans retenue, en partant du poids fort jusqu'à obtenir un résultat inférieur en nombre de bit au polynôme).

    Et j'avais pas vu, la page wikipédia en français contient un lien vers ce tuto de :dvp:

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 245
    Par défaut
    Citation Envoyé par Microbulle Voir le message
    - Est-ce qu'il existe une liaison série fiable pour Arduino déjà codé sous format de lib à importe ?
    Pour le calcul du crc16 sur Arduino, j'ai trouvé ça :
    http://www.arduino.cc/cgi-bin/yabb2/...1246539386/all

    http://code.google.com/p/arduino-rov...24e833e076c8b6
    http://code.google.com/p/arduino/sou...rduino/crc16.c

    Le premier lien est à étudier, j'ai pas pris le temps de tout lire.
    Les 2 autres liens, je te les mets aussi même si je trouve le code un peu bizarre. Je ne suis pas certain que ce ne soit pas des cas particuliers.

  4. #4
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Ah wai !

    Ok, je n'étais pas du tout parti là dessus. Effectivement, ce que je voulais faire n'est pas du CRC16 maus du CRC

    Effectivement, je ne suis pas tomber sur ces sources et du coup j'ai longuement patauger.

    Je pense faire ceci : Data 1 + Data2 / Lenght sur 1 octets max. L'opération inverse est possible car ces éléments là sont transmis.

    Par contre est-ce que ça fonctionnera pour 4, 5 data ? Il faudra que j'essaie sur un tableau

    Merci Sevy, problème résolu

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 245
    Par défaut
    Non, un CRC est un CRC, c'est quelque chose de bien défini.

    Tu veux certainement parler plutôt de checksum, dont il existe différent types (le CRC en est un). Il en existe des quantités.

    Si on est large d'esprit, le bit de parité en est un, mais pas très efficace car il ne détecte que des erreurs de bits en nombre impair.
    Tu as aussi les sommes modulaire, qui consiste à faire la somme des mots de tes données et à en prendre le complément à 2. L'avantage c'est qu'il se calcule très vite à la réception, puisqu'il suffit de faire la somme des mots y compris le checksum reçu, le résultat devant être égal à 0. Là aussi, si les erreurs sur un bit sont bien détectées, les erreurs sur 2 bits et plus ne le sont pas forcément toutes.
    Tu as aussi, le Ou exclusif avec chaque mot, la aussi toutes les erreurs ne sont pas forcément détectées.

    Le plus complet étant sans doute le CRC avant de mettre en place des solutions plus complexes comme les hashs style MD5, SHA, etc

    Ce que tu veux faire toi est en fait une moyenne (somme des mots/nombre des mots). Attention à la résolution, la partie décimale est tronquée. Si le cumul des erreurs est inférieur en valeur au nombre de mots, les erreurs ne seront pas vues car tronquées dans la partie décimale.

    La page wikidédia anglosaxone sur les checksum, elle est très succincte
    La page française donne une autre approche

  6. #6
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Oui, c'est ce que je me suis rendu compte

    Bon, je propose donc de me servir de ce post pour comprendre la démarche et en faire un algorythme

    Donc, si je comprends bien, je prends mes data, je les additionnent, puis je procède à un décalage vers la gauche.

    Trame à envoyer : 0x00 0x13 0x02 0x05 0x03 0x20

    0x00 = start
    0x13 = Sortie en PWM pour faire fonctionné un servo
    0x02 = 2 datas
    0x05 = data1 = servo N° 5
    0x03 = data2 = position ° de 0 à 180. Cela rentre dans les 0 à 255 d'un octet.
    0x20 = CRC

    CRC en emission:
    0x05 + 0x03 = 0x08
    0x08 = 00001000 en binaire, décaler vers la gauche 000100000 donc 0x20

    CRC en réception:
    Data1 + Data2 = Somme
    Somme décalé vers la gauche = CRC
    CRC = CRC trame


    Chez pas si c'est clair

  7. #7
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Suite aux remarques de Sevy sur le t'chat, je met à jour ma doc.
    Suite à des indications sur un autre forum, je change mon start bit.

    Le checksum sera composé de Type, Lenght, Data 1, Data 2...Data X / 256.

    Exemple pour une trame modifier de celle d'au dessus.

    Trame à envoyer : 0x0F 0x13 0x02 0x05 0x5A 0xE8

    0x0F = start
    0x13 = Sortie en PWM pour faire fonctionné un servo
    0x02 = 2 datas
    0x05 = data1 = servo N° 5
    0x5A = data2 = position ° de 0 à 180. Cela rentre dans les 0 à 255 d'un octet. Ici, c'est 90°.
    0xE8 = CRC

    CRC en emission:
    0x13 + 0x02 + 0x05 + 0x5A = 0x74
    0x74 / 255 = 0
    0x00 = 00000000 en binaire, décaler vers la gauche 00000000 donc 0x00

    CRC en réception:
    Type + Lenght + Data1 + Data2 = Somme
    Somme décalé vers la gauche = CRC
    CRC = CRC trame

    En théorie, si une erreur survient, la comparaison devient mauvaise et une erreur est levée.

    Edit:
    Il me semble que je fais une erreur sur ma division. Il devrait y avoir un code permettant de récupérer le reste de la division. Mais lequel, je ne sait pas encore.

    Quelqu'un à une idée ?

  8. #8
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 245
    Par défaut
    Comme indiqué sur le chat, la somme est à faire en 16bits, pour éviter le dépassement de capacité.

    La division à faire est le modulo (récupération du reste de la division euclidienne) et c'est par 256 qu'il faut diviser pour ne garder que la partie "8bits" du résultat de la somme. Le décalage pourra être fait avant la division.

    Trame à envoyer : 0x0F 0x13 0x02 0x05 0x5A 0xXX
    CRC en émission:
    0x0013 + 0x0002 + 0x0005 + 0x005A = 0x0074
    0x0074 LSH 1 = 0x00E8
    0x00E8 MOD 0x0100 = 0xE8

    Trame envoyée : 0x0F 0x13 0x02 0x05 0x5A 0xE8

  9. #9
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Ah wai d'accord !

    Bon, et bien j'ai plus qu'à trouvé comment ca se réalise niveau code

    J'ai peur de ne pas y arrivé facilement et ici on connais peu le petit monde Arduino

    Bon, ce n'est pas grave, je vais donc y allé pas à pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoi tableau de data sur port série
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2005, 16h23
  2. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  3. Recevoir "NULL" sur port série
    Par WinY57 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 04/03/2005, 11h37
  4. Etat de CTS sur port série
    Par Juste_Une_IlluZion dans le forum C++Builder
    Réponses: 9
    Dernier message: 12/09/2004, 10h46
  5. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04

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