Transferência de structs de dados entre MPUs via protocolos seriais

porAndré Luis Pereira dos Santos

Transferência de structs de dados entre MPUs via protocolos seriais

Quando lidamos com sistemas mais complexos em que existem mais que uma MPU (microcontrolador) e onde elas precisam comunicar-se entre si, devemos considerar alternativas que levem em conta o grau de segurança, confiabilidade e velocidade no tráfego de tais dados.

Quase sempre acabamos pensando em utilizar algum dos muitos protocolos seriais para tal, já que existem em grande quantidade e muitos são extremamente maduros, inclusive para aplicações de alto desempenho. Podemos citar alguns como o CAN, UART, I2C e SPI só pra ficar nos mais famosos.

Quase sempre acabamos por considerar a transferência de dados entre MPUs de forma binária também, justamente porquê em geral isso diminui o tamanho do payload das mensagens, o que implica em uma performance maior.

No entanto precisamos considerar diversas coisas se desejamos implementar uma comunicação nestes moldes entre MPUs.

A primeira é o fato de que se estamos transferindo structs inteiras (aquela struct do C) teremos de garantir que o formato binário deste dado seja lido corretamente pelo sistema receptor. Normalmente isso implica em termos o emissor e receptor rodando uma mesma arquitetura, ou uma arquitetura muito parecida.

Por exemplo, uma struct criada em uma MPU ARM Cortex M3 não poderá ser lida, sem tradução de seu formato binário, por uma outra MCU baseada na arquitetura usada pelo TI MSP430.

Os componentes da struct terão tamanhos diferentes e mesmo a struct pode ser envelopada de uma maneira totalmente diferente, mudando coisas como a maneira com que os dados são alinhados na memória, dentre outras coisas. (ex: um tipo int do ARM Cortex M3 possui 32 bits e o mesmo tipo no MSP430 possui 16 bits)

Para simplificar as coisas, daqui em diante vamos falar em troca de dados entre MPUs de mesma arquitetura através de um barramento serial.

Vou utilizar como exemplo a troca de dado entre dois STM32f103 através de suas UARTs.

Nesse ponto também é saudável que nos preocupemos com a confiabilidade desta transmissão. Dados trafegam através da UART bit a bit por um condutor metálico. São dois fios (uma para ida – TX – e outro para recepção de dados – RX) e mais um fio de GND como referência. Se estes fios não são muito compridos e caso as taxas de transferência não sejam muito altas, a transmissão tende a ocorrer de forma muito confiável.

image Transferência de structs de dados entre MPUs via protocolos seriais
Esquema de uma transmissão serial via UART

Os problemas aparecem quando utilizamos altas taxas de transferência e/ou temos comprimentos maiores para o meio físico de transmissão.

Ficamos ai muito sujeitos a interferência eletromagnética do ambiente ao redor e a interferência criada entre os próprios cabos de RX e TX.

Sobre isto, cheguei em algumas soluções simples, tais como a utilização de cabos blindados. Estes podem ser, inclusive, bons cabos USB devidamente preparados. Cortamos literalmente suas duas pontas e podemos utilizar dois de seus fios de maneira bastante segura para o tráfego serial e um terceiro fio do cabo para ligar os GNDs.

Outra solução é trançar dois cabos (RX e TX) entre si para mitigar a interferência ambiental e a interferência mútua entre os cabos. Esse design é extensivamente utilizado na indústria.

Dessa maneira, agora podemos trafegar dados a velocidades maiores sem que estes sejam perdidos ou sem que sofram corrupção.

Em tratando-se de transmissão via UART podemos também ativar a checagem de paridade de dados proporcionada pelo próprio protocolo. Aumentamos, assim, ainda mais a confiabilidade, às custas de uma pequena penalidade de velocidade, parcialmente compensada pelas medidas anteriores.

É um bom meio termo.

No próximo post irei falar sobre a implementação no software do firmware das transmissão de structs de dados em formato binário.

Sobre o Autor

André Luis Pereira dos Santos administrator