Implémentation de commandes de contrôle pour un MCU sur série

8

Je cherche à intégrer une interface de commande dans un projet que je fais et qui acceptera les commandes en série d'un PC.

L'idée est que l'appareil fera son travail mais qu'il reçoit une commande, il l'exécutera. Ceci est différent de la plupart des exemples que j'ai réussi à trouver, qui n'est qu'un appareil au ralenti en attente de données série.

Ainsi, par exemple, un appareil qui contrôle les LED et joue une animation. Disons qu'il y a 3 animations prédéfinies, et quand il s'allume, il joue toujours le numéro 1. Du côté PC, j'envoie une commande `` jouer le préréglage 2 '', ou `` changer la couleur en vert '' ou envoyer une animation en temps réel en direct à l'appareil pour jouer sur les LED.

Ma question est donc que je ne trouve pas beaucoup d'informations sur ce "modèle de conception"? Je ne sais pas par où commencer. Le plus proche que je suis venu est des bibliothèques d'analyse série arduino pré-faites. Cependant, je cherche plus d'approche C / non arduino / théorique.

J'ai étudié les protocoles série, mais ce ne sont que des choses telles que SPI et I2C, etc., pas vraiment comment implémenter une interface de contrôle / commande dans le logiciel.

J'ai également découvert HDLC, encore une fois, il semble qu'il s'agisse davantage d'un protocole standard / a. Un fil similaire est /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system qui a de très belles informations mais encore une fois à faire avec le protocole / communication lui-même.

Im essayant de trouver comment coder / implémenter cela pour créer une capacité de commande ou de contrôle.

Dois-je utiliser une boucle infinie pour surveiller et attraper la série pour une commande entrante, et utiliser une liste d'instructions IF pour choisir la commande à exécuter, mais ensuite ce qui se passe lorsqu'aucune commande et que le système ne devrait être normal, ou si elle manque une commande?

Entraînée par interruption, machine d'état?

Y a-t-il un nom officiel pour cela qui peut être utilisé pour rechercher et trouver des exemples?

ÉDITER:

Pour tous ceux qui ont la même question, j'ai trouvé cet exemple vraiment sympa en cherchant, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

binarysmacker
la source
Pourquoi ne pas utiliser un framework tel que FreeMODBUS ou Firmata?
Ignacio Vazquez-Abrams

Réponses:

5

Il existe de nombreuses façons de mettre en œuvre un protocole de communication. Par exemple, vous pouvez choisir d'utiliser:

  • format lisible par l'homme ou binaire
  • vérification des erreurs comme une somme de contrôle ou CRC
  • caractères de début et / ou de fin du message
  • longueur du message, nombre, etc. informations utiles
  • mécanismes de reconnaissance / reconnaissance / réessai négatifs

Votre exemple de commande est lisible par l'homme et doit utiliser '\ n' (entrée) comme caractère de fin de message. Les caractères de début / fin de message facilitent l'analyse du flux d'entrée.

Un flux de programme typique consisterait à attendre la réception du caractère de début, puis à stocker les octets suivants dans un tampon de message jusqu'à la réception du caractère de fin. Une fois que cela se produit, passez le tampon à une autre fonction pour analyser le message. S'il n'y a pas de caractère de début, commencez simplement à stocker les octets immédiatement jusqu'à ce que le caractère de fin soit reçu.

La plupart des systèmes embarqués * fonctionnent dans une boucle infinie. La gestion de la transmission et de la réception série se fait via des interruptions sur l'Arduino (voir HardwareSerial.cpp). Les caractères reçus sont placés dans un tampon. À chaque itération de la boucle, vous vérifiez s'il y a des caractères dans le tampon (Serial.available ()) et vous les traitez. En recevant des caractères en utilisant des interruptions, aucun caractère ne doit être manqué. Cependant, vous ne faites pas tout le traitement dans ces routines d'interruption, sinon elles deviennent trop longues et manquent donc les interruptions suivantes.

Si vous ne voulez pas que votre appareil reste en veille, mettez-le en veille pour `` suspendre '' la boucle jusqu'à une interruption ou un autre événement.

J'aime vraiment cette bibliothèque pour la messagerie lisible par l'homme: http://playground.arduino.cc/Code/Messenger

* Je ne peux pas penser à un système qui ne fonctionne pas mais peut-être qu'il y en a un.

geometrikal
la source
3

Tout ce que votre programme doit faire est de:
1. vérifier fréquemment le port série pour un nouveau caractère
2. passer à la routine appropriée / définir l'état / peu importe, selon le caractère
3. aller à 1

Le programme peut agir sur des caractères uniques, ou vous pouvez créer votre propre format de message - j'ai souvent commencé un cammand avec "$" et fini par un retour à la ligne, et j'ai utilisé des caractères ASCII lisibles pour la commande (facilite le débogage!).

Assurez-vous que le programme ne se bloquera pas s'il reçoit une commande invalide!

Peter Bennett
la source
Certains équipements de test automatisé (ATE) utilisent des liaisons série très similaires pour ce faire.
Cuillère