Implementando comandos de controle para um MCU sobre serial

8

Eu estou olhando para integrar uma interface de comando em um projeto que estou fazendo que aceitará comandos em série a partir de um PC.

A idéia é que o dispositivo faça suas coisas, mas receba um comando, ele executará. Isso é diferente da maioria dos exemplos que consegui encontrar, que é apenas um dispositivo inativo aguardando dados seriais.

Por exemplo, um dispositivo que controla LEDs e reproduz uma animação. Digamos que haja 3 animações predefinidas e, quando ativada, sempre reproduz o número 1. No lado do PC, eu enviava um comando 'play preset 2' ou 'muda de cor para verde' ou enviava uma animação ao vivo em tempo real para o dispositivo para jogar nos LEDs.

Então, minha pergunta é que não consigo encontrar muita informação sobre esse "padrão de design"? Não sei por onde começar a procurar. O mais próximo que eu cheguei é de bibliotecas pré-fabricadas de análise serial do arduino. No entanto, estou procurando mais de C / não arduino / abordagem teórica.

Eu estou olhando para protocolos seriais, mas isso é apenas coisas como SPI e I2C etc, não realmente como implementar uma interface de controle / comando no software.

Eu também descobri sobre o HDLC, embora pareça ser mais um protocolo padrão. Um segmento semelhante é /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system Que possui algumas informações muito boas, mas novamente deve ser feito com o próprio protocolo / comunicação.

Estou tentando descobrir como codificar / implementar isso para criar uma capacidade de comando ou controle.

Utilizo um loop infinito para monitorar e capturar a série de um comando recebido e uso uma lista de instruções IF para escolher qual comando executar, mas o que acontece quando nenhum comando e o sistema devem ser normais ou se falta um comando?

Máquina de estado acionada por interrupção?

Existe um nome oficial para isso que possa ser usado para pesquisar e encontrar exemplos?

EDITAR:

Para quem tem a mesma pergunta, encontrei este exemplo muito bom enquanto pesquisava, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

binarysmacker
fonte
Por que não usar uma estrutura como FreeMODBUS ou Firmata?
Ignacio Vazquez-Abrams

Respostas:

5

Existem muitas maneiras de implementar um protocolo de comunicação. Por exemplo, você pode optar por usar:

  • formato legível humano ou binário
  • verificação de erro, como uma soma de verificação ou CRC
  • caracteres de mensagem inicial e / ou final
  • comprimento da mensagem, número etc informações de carga útil
  • mecanismos de confirmação / confirmação / tentativa negativa

Seu comando de exemplo é legível por humanos e deve usar '\ n' (enter) como o final do caractere da mensagem. Os caracteres de início / fim da mensagem facilitam a análise do fluxo de entrada.

Um fluxo de programa típico seria aguardar o recebimento do caractere inicial e, em seguida, armazenar os bytes subsequentes em um buffer de mensagem até que o caractere final seja recebido. Quando isso acontecer, passe o buffer para outra função para analisar a mensagem. Se nenhum caractere inicial, basta começar a armazenar bytes imediatamente até que o caractere final seja recebido.

A maioria dos sistemas embarcados é executada em um loop infinito. O tratamento da transmissão e recepção serial é feito através de interrupções no Arduino (consulte HardwareSerial.cpp). Os caracteres recebidos são colocados em um buffer. Em cada iteração do loop, você verifica se há algum caractere no buffer (Serial.available ()) e os processa. Ao receber caracteres usando interrupções, nenhum personagem deve ser esquecido. Você não realiza todo o processamento nessas rotinas de interrupção; caso contrário, elas se tornam muito longas e, portanto, perdem as interrupções subsequentes.

Se você não quiser que seu dispositivo fique em loop inativo, coloque-o em um estado de suspensão para 'pausar' o loop até uma interrupção ou outro evento.

Eu realmente gosto desta biblioteca para mensagens legíveis por humanos: http://playground.arduino.cc/Code/Messenger

* Não consigo pensar em um sistema que não funciona, mas talvez exista um por aí.

geometrikal
fonte
3

Tudo o que seu programa precisa fazer é:
1. verificar frequentemente a porta serial quanto a um novo caractere
2. pular para a rotina apropriada / definir o status / o que for, dependendo do caractere
3. vá para 1

O programa pode atuar com caracteres únicos ou você pode criar seu próprio formato de mensagem - geralmente inicio uma cammand com "$" e termino com nova linha, e usei caracteres ASCII legíveis para o comando (facilita a depuração!).

Verifique se o programa não será desligado se receber um comando inválido!

Peter Bennett
fonte
Alguns equipamentos de teste automatizados (ATE) usam links seriais muito semelhantes para fazer isso.
Colher