Implementando los comandos de control para una MCU sobre una serie

7

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 su trabajo pero recibe un comando y lo ejecuta. Esto es diferente a la mayoría de los ejemplos que logré 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 juega el número 1. En el lado de la PC, enviaría un comando 'jugar preset 2' o 'cambiar de color a verde' o enviar una animación en vivo en tiempo real al dispositivo para que se reproduzca 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 mirar. Lo más cerca que he venido es prefabricado las bibliotecas de análisis de serie de arduino. Sin embargo, estoy buscando más de C / no arduino / enfoque teórico.

He investigado los protocolos serie, pero eso es solo cosas como SPI e I2C, no realmente 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 enlace Lo cual tiene información muy buena, pero nuevamente tiene que ver 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 la serie para un comando entrante, y uso una lista de sentencias IF para elegir qué comando ejecutar, pero luego qué sucede cuando no hay comandos y el sistema debería ser tan normal? o si se pierde un comando?

¿Interruptor accionado, máquina de estado?

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

EDITAR:

Para cualquiera que tenga la misma pregunta, encontré este buen ejemplo mientras investigaba. enlace

    
pregunta binarysmacker

2 respuestas

5

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

  • formato legible para humanos o binario
  • comprobación de errores, como una suma de comprobación o CRC
  • iniciar y / o finalizar los caracteres 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 / 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 de inicio, 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 de inicio, 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 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 bucle, verifica si hay algunos caracteres en el búfer (Serial.available ()) y los procesa. Al recibir caracteres utilizando interrupciones, no se deben perder caracteres. Sin embargo, no hace todo el procesamiento en estas rutinas de interrupción, de lo contrario, se vuelven demasiado largas y, por lo tanto, se pierden las interrupciones posteriores.

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

Realmente me gusta esta biblioteca para mensajes humanos legibles: enlace

* No puedo pensar en un sistema que no lo haga, pero quizás haya uno por ahí.

    
respondido por el geometrikal
3

Todo lo que tu programa tiene que hacer es:
1. Revise frecuentemente el puerto serial para un nuevo carácter
2. Salte a la rutina apropiada / establecer estado / lo que sea, dependiendo del personaje. 3. ir a 1

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

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

    
respondido por el Peter Bennett

Lea otras preguntas en las etiquetas