Implementación de comandos de control para una MCU a través de serie

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

La idea es que el dispositivo haga lo suyo, pero si 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 con 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 buscar. Lo más cerca que he llegado son las bibliotecas de análisis en serie de arduino prefabricadas. Sin embargo, estoy buscando más de C / no arduino / enfoque teórico.

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

También me enteré de HDLC, aunque parece ser más un protocolo estándar. Un hilo similar es https://stackoverflow.com/questions/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system , que tiene muy buena información, pero de nuevo tiene que ver con el propio protocolo/comunicación.

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

¿Uso un bucle infinito para monitorear y capturar la serie para un comando entrante, y uso una lista de declaraciones IF para elegir qué comando llevar a cabo, pero luego qué sucede cuando no hay comandos y el sistema debería ser normal, o si pierde un comando?

¿Máquina de estado impulsada por interrupciones?

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

EDITAR:

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

¿Por qué no usar un marco como FreeMODBUS o Firmata?

Respuestas (2)

Hay muchas formas de implementar un protocolo de comunicación. Por ejemplo, puede optar por utilizar:

  • formato legible por humanos o binario
  • comprobación de errores como una suma de comprobación o CRC
  • caracteres de inicio y/o finalización del mensaje
  • 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' (ingresar) como el final del carácter del mensaje. Los caracteres de inicio/final del mensaje facilitan el análisis del flujo de entrada.

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

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 a través de interrupciones en el Arduino (ver HardwareSerial.cpp). Los caracteres recibidos se colocan en un búfer. En cada iteración del ciclo, verifica si hay caracteres en el búfer (Serial.disponible()) y los procesa. Al recibir caracteres usando interrupciones, no se debe perder ningún carácter. 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 se quede inactivo en bucle, póngalo en 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 haya uno por ahí.

Todo lo que su programa tiene que hacer es:
1. Verificar con frecuencia el puerto serie en busca de un nuevo carácter
2. Saltar a la rutina apropiada/establecer 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 terminé con una nueva línea, y usé caracteres ASCII legibles para el comando (¡hace que la depuración sea más fácil!).

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

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