[Tuto] Implémenter un protocole de communication

Bonsoir

Ma semaine de congés étant finie, j’accouche de ce tuto.
L’idée m’en a été donnée par quelques discussion que j’ai eu sur le forum cette semaine, notamment avec HadesDT.

Le sujet est l’implémentation propre d’une messagerie, généralement sur liaison série ou dérivée.
Propre ça veut dire claire, maintenable, extensible, résistante aux erreurs de transmission.

Les premiers chapitres, notamment le n°2 est un peu théorique et on peu le sauter dans une première approche. Toutefois, il est préférable d’y revenir un peu plus tard. Les patients pourront le lire dès le début.

Le chapitre 3 propose l’implémentation, avec code source complet, d’un protocole ASCII qui peut s’appliquer à la liaison série (Serial de base ou Serial2/3… sur Mega ou même SoftSerial), ou bien a n’importe qu’elle classe de stream dérivée de la classe Arduino Stream.

Si cela intéresse du monde, j’envisage un chapitre 4 sur l’implémentation d’un protocole binaire cette fois.

Le code n’implémente que le coté esclave sur Arduino. En fonction de l’intérêt je pourrais proposer aussi le code du maître sur Visual C# ou bien une version du maître sur Arduino pour une communication Arduino/Arduino.

Si quelqu’un souhaite contribuer avec un exemple maître en Processing, il est le bienvenue.

L’ensemble est sous licence Creative Commons CC BY-NC-SA 2.0 pour la doc et GPL v2 pour le code.


Historique
v1.0 22 avril 2012 Version Initiale
v1.0a 22 avril 2012 Avec le code corrigé cette fois :wink: ==> télécharger ici si le lien du forum ne marche pas

Implémenter un protocole de communication v1_0a.zip (47.7 KB)

Yop Yop, Sympa comme tutoriel, on y vois bien l'intérêt d'implémenter un protocole de communication et qu'il ne suffit pas d'envoyer 1 octet pour ce faire comprendre en tout sécurité. Ça peut paraitre évident à la lecture du tutoriel mais peut être bien préciser aux début de celui-ci qu'une communication ce fait par octet et pourquoi tu découpes certaines variables en 2,4, ... , octets ? Enfin c'est juste pour bien dissiper les doutes éventuels aux départ du tuto, comme c'est la première chose qu'ils tenteront : envoyer un int, double, etc, sur le port série qui évidement ne correspondront pas à l'autre bout de la ligne. Sinon quand à la qualité du tutoriel je donnerais 9/10, j'aurais pas fais mieux vu la complexité d'essayer de faire comprendre ce qui nous parait évident. ;)

ps: Peut être un petit pdf à la place d'un doc ?

Peut être un petit pdf à la place d'un doc

Non parce qu'un "doc" ou un "odt" on peut l'éditer pour son usage personnel et c'est bien pratique.

Par contre le "zip" m'a fichu le souk sous debian testing -> fichier zombie. Est-ce l'accent et les espaces dans le nom du fichier ? Pourrais-tu publier la prochaine édition sans zipper ni accent ni espace, merci. Pour la taille sur le serveur les fichiers odt sont déjà compressés. "odt" est maintenant géré par Microsoft. Surtout pas de "docx", merci.

Merci, c’est vraiment tres clair et tres instructif

Pas PDF, DOC çà restera. License CC donc comme pour le GPL, c'est de la doc "Open Source". C'est pas Arduino Spirit çà ;) ODT bien qu'un format "ouvert" n'est pas assez répendu pour les débutants. Donc comme les solutions libres savent lire du DOC, no problemo. D'ailleurs cette donc n'a pas été rédigée vace M$ Word mais avec TextMaker2008, un clone allemand de Word2003 qui marche du feu de Dieu sur un netbook alors qu'on ne peut pas en dire autant ni de OpenOffice (RIP =() ni de LibreOffice qui sont toutes 2 aussi lourdingue que leur frangine de Redmond.

Je vais regarder pour les histoires d'accent, mais je préfère que la distribution reste sous la forme de ZIP pour que code + doc restent ensembles. Si je commence à me mettre à Github, je suis pas sur que les débutants s'en sortiront :D

Osaka, tu pourrait revenir vers moi avec plus de détails sur tes commentaires. Je ne suis pas sur de comprendre ce que tu voudrais que je modifie.

Moi aussi sur Ubuntu j'avais un nom de fichier bizarre à cause de l'accent. Mais j'ai réussi à l'ouvrir.

J'ai trouvé ce doc de très bonne qualité. Très clair et bien documenté/argumenté.

Merci.

Hello,

Super doc !, elle arrive à point pour moi , je suis en plein dedans, arduino (Teensy) en esclave et µLCD43PT 4Dsystem GFX en maitre le Teensy execute certaines taches en fonction des évennement générés par le touch panel notamment l'envoi de datas via I2C vers un chip Si570, cependant je prévois également pour l'arduino de piloter l' affichage lors d'action sur un encodeur ou bien de boutons poussoirs donc il me faut du bidirectionnel aux niveaux des commandes Cordialement, f1apy

barbudor: Osaka, tu pourrait revenir vers moi avec plus de détails sur tes commentaires. Je ne suis pas sur de comprendre ce que tu voudrais que je modifie.

Pas vraiment besoin de modifier, c'est une simple suggestion. Peut être une précision à mette en début du tuto pour les débutants vraiment débutant qui on du mal à visualisé le fait qu'une transaction ce fais octet par octet et non une variable (de plus d'un octet) entière d'un coup. D'un côté ça voudrait dire qu'ils ne savent pas ce qu'est un octet :sweat_smile:. Enfin de toute façon on s'en aperçois assé rapidement dans ton tuto donc là c'est moi qui en fais un peux trop sans doute :* (et pourquoi je n'en fini pas avec mon tuto sur les pointeurs :sweat_smile:), c'est juste qu'on rencontre de temps en temps la question: "Pourquoi lorsque j'envoie un float avec mon arduino j'ai 4 entier de l'autre côté ?", donc j’anticipe . Sinon dans ça globalité le tuto est parfait, c'est de l’excellent travail. ;)

Version linux.

Effectivement, l’accent ou le codage du “é” est trés mal géré sous linux (UTF8). seul mc (alias midnight commander) le supporte.

@+

Zoroastre.

Implementer un protocole de communication.tar (160 KB)

Bonjour,

Super documentation. Merci. Je vais l'utiliser pour remplacer la bidouille de protocole que j'avais implémenté dans mon projet : non seulement les communications seront mieux gérées (timeout, ...) mais en plus ça aura de la "gueule" :)

Encore merci.

A+

Philippe.

Bonjour,

Bravo Barbubor, toujours aussi efficace. @+ Icare

Super tutoriel merci Par contre impossible de lire le doc (même sans accent) sur Android avec officesuite er kingsoftoffice

Hello Barbudor,

super, mais j’ai un petit pb , lorsque que j’ouvre le doc avec word µ$, il me manque le diagramme du protocole de réception,
y a pas moyen d’avoir la doc en pdf ? ce serait bien mieux et on s’affranchit des pb de TT de Txt, sinon avec quel soft il faut que j’ouvre le document ?
Cordialement,
Jacques


3.3.3. L’algorithme de réception
C’est sur l’algorithme de gestion de la réception des messages que porte la difficulté de l’exercice. Voici l’algorithme en question sous la forme d’un diagramme :

<<< INSERER DIAGRAMME RECEPTION >>>


En fait, tu as le document dans son entier

j'ai pas encore fait le diagramme :roll_eyes: :disappointed_relieved:

:grin: hi,

bon je vai essayer de regarder le code pour comprendre, mais le c++ n'est pas ma tasse de thé :fearful: merci quand même, bonne journée Jacques

Vive les logiciels libres aux formats normalisés ISO, qui tournent sur plusieurs systèmes d'exploitation et qui de surcroît sont gratuits comme libreoffice (traitement de texte + tableur + dessins + présentation + base de donnée[->là pas terrible] ). Merci de toujours avoir à l'esprit que Windows n'est pas une obligation et que Linux, Mac, Androïd, existent aussi. Penser aussi que si vous n'avez pas Linux, par symétrie celui qui a Linux (Mac) n'a pas Windows.

Le format pdf n’est pas une aussi bonne idée qu’il parait. Un pdf est fait pour ne pas être modifié.
Sur ce forum nous délivrons des documents “libres”, AMHA il faut donc laisser à chaque utilisateur la possibilité de l’adapter et/ou de le compléter suivant ses besoins personnels.

Très bon tuto dans l'ensemble en tout cas !

Je suis entrain d'essayer de comprendre le code (le C est mon "am"i mais le C++ pas z"encore mais bon apparemment la seule chose du C++ que tu/vous utilise"s/z" sont les bool qui ne sont pas présent dans le C)

Je viens de dévorer votre code ! Bravo je le trouve super bien codé.

Ca m'inspire pas mal pour améliorer le mien, mais pour le petit système que je fais, je ne sais pas si séparer les deux "couches" de message comme vous le faites est une bonne idée. En tout cas bravo pour le travail fourni !

Si la couche basse de transport des messages convient, autant la garder telle quelle et travailler sur la couche supérieure. C'est le but de la séparation des couches.

Bonjour,

Je viens de parcourir le code et suis assez content, car il se rapproche de ce que j'ai fait. Félicitation pour ton travail. Je serai assez intéressé par un article sur un protocole binaire (celui que j'utilise), notamment la façon dont on peut éviter les erreurs de détection entre les tokens de début et les données. C'est toujours dans les tuyaux ?

Merci à toi.