Implementación de comandos de control para una MCU en serie

8

Estoy buscando integrar una interfaz de comandos en un proyecto que estoy haciendo que acepte comandos en serie desde una PC.

La idea es que el dispositivo haga lo suyo, pero se le envía un comando, lo ejecutará. Esto es diferente a la mayoría de los ejemplos que he logrado encontrar, que es solo un dispositivo inactivo que espera datos en serie.

Entonces, por ejemplo, un dispositivo que controla los LED y reproduce una animación. Digamos que hay 3 animaciones preestablecidas, y cuando se enciende, siempre reproduce el número 1. En el lado de la PC, enviaría un comando 'reproducir preestablecido 2' o 'cambiar el color a verde' o enviar una animación en vivo en tiempo real al dispositivo para jugar en los LED.

¿Entonces mi pregunta es que no puedo encontrar mucha información sobre este "patrón de diseño"? No sé por dónde empezar a mirar. Lo más cercano que he llegado son las bibliotecas de análisis serie Arduino prefabricadas. Sin embargo, estoy buscando más de C / no arduino / enfoque teórico.

He estado buscando protocolos en serie, pero eso es solo cosas como SPI e I2C, etc., no realmente cómo implementar una interfaz de control / comando en el software.

También descubrí HDLC, aunque parece ser más un protocolo estándar / a. Un hilo similar es /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system que tiene una información muy buena, pero de nuevo es para hacer con el protocolo / comunicación en sí.

Estoy tratando de encontrar cómo codificar / implementar esto para crear un comando o capacidad de control.

¿Utilizo un bucle infinito para monitorear y capturar el serial para un comando entrante, y uso una lista de sentencias IF para elegir qué comando llevar a cabo, pero luego qué sucede cuando no hay comandos y el sistema debería ser tan normal, o si es así? pierde un comando?

¿Interrupción conducida, máquina de estado?

¿Existe un nombre oficial para esto que pueda usarse para investigar y encontrar ejemplos?

EDITAR:

Para cualquiera que tenga la misma pregunta, encontré este ejemplo realmente agradable mientras investigaba, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

binarysmacker
fuente
¿Por qué no usar un marco como FreeMODBUS o Firmata?
Ignacio Vazquez-Abrams

Respuestas:

5

Hay muchas formas de implementar un protocolo de comunicación. Por ejemplo, puede elegir usar:

  • formato legible por humanos o binario
  • comprobación de errores como una suma de comprobación o CRC
  • caracteres de mensaje inicial y / o final
  • longitud del mensaje, número, etc. información de carga útil
  • mecanismos de reconocimiento / reconocimiento negativo / reintento

Su comando de ejemplo es legible por humanos y debe usar '\ n' (enter) como el carácter final del mensaje. Los caracteres de inicio / finalización del mensaje facilitan el análisis de la secuencia de entrada.

Un flujo de programa típico sería esperar a que se reciba el carácter inicial, luego almacenar los bytes subsiguientes en un búfer de mensajes hasta que se reciba el carácter final. Una vez que eso sucede, pase el búfer a otra función para analizar el mensaje. Si no hay un carácter inicial, simplemente comience a almacenar bytes inmediatamente hasta que se reciba el carácter final.

La mayoría de los sistemas integrados * se ejecutan en un bucle infinito. El manejo de la transmisión y recepción en serie se realiza mediante interrupciones en el Arduino (consulte HardwareSerial.cpp). Los caracteres recibidos se colocan en un búfer. En cada iteración del bucle, verifica si hay caracteres en el búfer (Serial.available ()) y los procesa. Al recibir caracteres usando interrupciones, no se deben perder caracteres. Sin embargo, no realiza todo el procesamiento en estas rutinas de interrupción, de lo contrario, se vuelven demasiado largas y, por lo tanto, pierden las interrupciones posteriores.

Si no desea que su dispositivo permanezca inactivo en bucle, póngalo en un estado de suspensión para 'pausar' el bucle hasta una interrupción u otro evento.

Realmente me gusta esta biblioteca para mensajes legibles por humanos: http://playground.arduino.cc/Code/Messenger

* No puedo pensar en un sistema que no lo haga, pero tal vez hay uno por ahí.

Geometrikal
fuente
3

Todo lo que su programa tiene que hacer es:
1. verificar con frecuencia el puerto serie para un nuevo carácter
2. saltar a la rutina apropiada / establecer el estado / lo que sea, dependiendo del carácter
3. ir a 1

El programa puede actuar en caracteres individuales, o puede crear su propio formato de mensaje: a menudo comencé un cammand con "$" y finalicé con nueva línea, y usé caracteres ASCII legibles para el comando (¡facilita la depuración!).

¡Asegúrese de que el programa no se cuelgue si recibe un comando no válido!

Peter Bennett
fuente
Algunos equipos de prueba automatizados (ATE) utilizan enlaces seriales muy similares para hacer esto.
Cuchara