Como a comunicação serial assíncrona está amplamente difundida entre os dispositivos eletrônicos até hoje em dia, acredito que muitos de nós já encontramos essa pergunta periodicamente. Considere um dispositivo eletrônico D
e um computador PC
conectado à linha serial (RS-232 ou similar) e necessário para trocar informações continuamente . Ou seja, PC
está enviando um quadro de comando cada X ms
e D
está respondendo com quadro de relatório / telemetria de status cada Y ms
(o relatório pode ser enviado como resposta a solicitações ou de forma independente - não importa realmente aqui). Os quadros de comunicação podem conter quaisquer dados binários arbitrários . Supondo que os quadros de comunicação sejam pacotes de comprimento fixo.
O problema:
Como o protocolo é contínuo, o lado receptor pode perder a sincronização ou simplesmente "ingressar" no meio de um quadro enviado em andamento; portanto, não saberá onde está o início do quadro (SOF). Se os dados tiverem um significado diferente, com base em sua posição em relação ao SOF, os dados recebidos serão corrompidos, potencialmente para sempre.
A solução necessária
Esquema confiável de delimitação / sincronização para detectar o SOF com pouco tempo de recuperação (isto é, não deve demorar mais do que, digamos, 1 quadro para ressincronizar).
As técnicas existentes que conheço (e utilizo algumas) de:
1) Cabeçalho / soma de verificação - SOF como valor predefinido de bytes. Soma de verificação no final do quadro.
- Prós: Simples.
- Contras: Não confiável. Tempo de recuperação desconhecido.
2) Byte stuffing:
- Prós: recuperação rápida e confiável, pode ser usada com qualquer hardware
- Contras: Não é adequado para comunicação baseada em quadro de tamanho fixo
3) marcação do 9º bit - adicione cada byte com um bit adicional, enquanto SOF marcado com 1
e bytes de dados são marcados com 0
:
- Prós: Recuperação confiável e rápida
- Contras: Requer suporte de hardware. Não é suportado diretamente pela maioria do
PC
hardware e software.
4) Marcação do 8º bit - tipo de emulação dos itens acima, enquanto utiliza o 8º bit em vez do 9º, deixando apenas 7 bits para cada palavra de dados.
- Prós: recuperação rápida e confiável, pode ser usada com qualquer hardware.
- Contras: Requer um esquema de codificação / decodificação de / para a representação convencional de 8 bits para / da representação de 7 bits. Um pouco desperdício.
5) Baseado em tempo limite - assuma o SOF como o primeiro byte vindo após algum tempo ocioso definido.
- Prós: Sem sobrecarga de dados, simples.
- Contras: Não é tão confiável. Não funcionará bem com sistemas de tempo ruim como, por exemplo, Windows PC. Sobrecarga potencial de sobrecarga.
Pergunta: Quais são as outras possíveis técnicas / soluções para resolver o problema? Você pode apontar para os contras na lista acima, que podem ser facilmente contornados, removendo-os? Como você (ou você) projetou seu protocolo de sistemas?