Bons protocoles basés sur RS232 pour les communications intégrées à l'ordinateur

10

Je travaille sur un projet qui implique une bonne communication de données entre un Arduino distant et un ordinateur. La connexion sans fil se fait via une paire de XBees, nous avons donc une liaison RS232 entre l'Arduino et l'ordinateur. Pour de petites quantités de données, il est assez facile de rassembler un protocole de communication simple. Pour les projets plus importants, quels sont les bons protocoles de communication simples?

J'ai regardé MODBUS, qui semble être une option viable, mais je voulais voir s'il y avait d'autres meilleures options.

Computerish
la source
2
Quelles sont exactement les exigences?
Vous cherchez des suggestions générales. La simplicité et les faibles frais généraux seraient les principaux objectifs du projet.
Computerish
1
Désolé, je voulais aussi dire: combien de données, à quelle vitesse
Je n'ai pas de mesures quantitatives pour cela, mais pas beaucoup et la vitesse n'est pas un gros problème.
Computerish
7
Pas grand chose et la vitesse n'étant pas un problème plaident fortement pour quelque chose de lisible par l'homme, car cela rend le développement et le débogage beaucoup plus faciles. C'est formidable lorsque vous pouvez connecter un terminal et vous substituer à l'une ou l'autre extrémité du lien.
Chris Stratton

Réponses:

4

L'OP demande un protocole série pour une situation où " pas beaucoup [de données] et la vitesse n'est pas un problème énorme ". MODBUS est mentionné dans l'OP MODBUS sur RS-485 n'est pas un protocole rapide. Bien que ce ne soit pas une spécification, cela donne une idée de la niche.

Je ne peux penser qu'à deux protocoles standard communs pour ce créneau:

  • NEMA 0183 . Protocole ASCII en texte brut. Lisible par l'homme. Point à point uniquement. Ne prend pas en charge le bus multipoint.
  • MODBUS déjà mentionné dans le PO

Très souvent, lorsque les programmeurs intégrés sont dans la situation comme l'OP, ils conçoivent leurs propres protocoles de communication série à partir de zéro.

Nick Alexeev
la source
10

Certains protocoles de système embarqué, dont certains extrêmement simples, sont répertoriés dans Embedded Systems: Common Protocols , notamment:

Peut-être que l'un de ces protocoles conviendrait à votre application telle quelle ou avec seulement quelques ajustements mineurs.

davidcary
la source
6

Je voterais le vôtre et le garderais aussi simple que possible.

J'ai traité de nombreux protocoles série pour diverses applications de contrôle, et quelques choses que je peux vous recommander d'inclure sont:

  • Démarrer et arrêter des caractères qui ne sont pas utilisés ailleurs
  • Une sorte de somme de contrôle / vérification d'erreur
  • Une certaine méthode de contrôle de flux / signalisation, surtout si vous avez besoin de communications bidirectionnelles.

Comme exemple très basique, vous pouvez convertir vos données en caractères ASCII et les coller dans des caractères de démarrage / arrêt comme ceci:

Pour envoyer la valeur d'octet 0x7A, les données envoyées seraient (7A), où les () sont les caractères de démarrage / arrêt choisis et 7 et A sont deux caractères ascii. OK, cela ajoute beaucoup de frais généraux, mais cela signifie que vous pouvez déboguer avec un logiciel de terminal de base.

John U
la source
5

Si vos données passent par XBees, vous devez mettre les modules en mode API avec des caractères d'échappement, diviser vos données en paquets logiques et profiter du fait qu'en mode API, un paquet qui est donné à un XBee arrivera intact ou pas du tout. Concevez votre protocole autour de la transmission de blocs de 1 à 255 octets et laissez les modules XBee s'inquiéter de la façon de fournir les données dans chaque bloc. Ne vous inquiétez pas du maintien de l'intégrité des paquets individuels ou des subdivisions entre eux. Les modules Digi feront un bon travail pour s'en occuper. La plus grande chose à laquelle vous devez vous inquiéter est le fait que même si le nœud qui transmet un paquet pense qu'il n'a pas été livré et envoie un remplacement, le destinataire peut finir par l'obtenir de toute façon - peut-être même après avoir obtenu le remplacement. Les choses peuvent être plus faciles si vous concevez votre protocole de manière à ce qu'un côté soit le «maître»; si le maître demande une donnée, l'esclave doit l'envoyer une fois et ne pas se soucier de savoir si le maître l'obtient. Si le maître n'obtient pas les données qu'il souhaite, il peut les demander à nouveau.

L'esclave doit attribuer une sorte de numéros de séquence aux données, et le maître doit attribuer des numéros de séquence aux demandes de changement d'état de l'esclave. Si la demande du maître est de la forme "envoyer le premier élément dont le numéro de séquence est supérieur à XXX", et chaque élément de données par l'esclave comprend son propre numéro de séquence et celui de l'élément précédent (s'ils ne sont pas numérotés consécutivement ), les paquets arrivant tardivement peuvent amener l'esclave à envoyer des données de manière redondante au maître, mais le maître n'aura aucune difficulté à ignorer les réponses arrivantes tardives qui en découlent. Si l'esclave reçoit une demande de changement d'état dont le numéro de séquence est inférieur à celui d'une demande antérieure, il doit ignorer cette demande, car elle a été remplacée avant même d'être reçue.

supercat
la source
3

Que diriez - vous Firmata ? Il prend en charge divers systèmes d'exploitation et langages de programmation. Les contrôleurs Arduino et PICduino sont pris en charge, mais cela ne devrait pas être trop difficile à porter sur un microcontrôleur nu.

jippie
la source
3

J'avais une question similaire à celle-ci et je n'ai jamais rien trouvé de simple et assez petit pour les petits AVR, etc. J'ai donc roulé quelque chose d'inspiré par CAN. Cela s'appelle MIN (Microcontroller Interconnect Network):

https://github.com/min-protocol/min

J'ai blogué à ce sujet ici:

https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

Il existe des crochets pour les données de bloc, mais il vise principalement les signaux des capteurs / actionneurs. J'ai défini un format JSON pour décrire les signaux et leur emballage dans les trames MIN et j'espère obtenir un dissecteur Wireshark qui l'utilisera.

Ken Tindell
la source