Analisando dados UART delimitados por tempo

Ao tentar fazer engenharia reversa e decodificar corretamente os dados em uma conexão UART, cheguei às seguintes conclusões sobre o formato dos dados que estão sendo recebidos.

Os dados são enviados em "pacotes". Cada pacote é delimitado apenas pelo tempo (espaços) entre as transmissões.Pacotes são de tamanho variável. O comprimento é especificado pelo terceiro byte na sequência.Os dados sãonão enquadrado usando caracteres especiais ou sinais fora da banda, mas um pacote de dados válido pode ser (supostamente) válido, com base no byte final, que é um valor de soma de verificação do quadro.

Ao usar um analisador lógico, é fácil discernir pacotes. No entanto, alimentar os dados via UART para um programa impossibilita a delimitação de pacotes. Todos os dados recebidos são enfileirados pelo sistema operacional. Embora determinados manipuladores possam ser adicionados para acionar eventos recebidos de dados, isso não garante que os dados disponíveis na fila de uart do sistema operacional sejam um pacote inteiro.

Existem práticas recomendadas para separar esses dados?

Termo aditivo:

Minha solução atual (que possui uma sobrecarga enorme e uma grande taxa de erros):

A partir do primeiro byte na fila, tente analisar um quadro. Se o tamanho especificado no quadro for maior que 0x20 (não há pacotes maiores que 32 bytes - cabeçalho e soma de verificação incluídos), o atual "byte inicial" será considerado inválido e eliminado, e o reconhecimento continuará a partir do próximo byte, etc.

A outra solução em que estou trabalhando é usar um microcontrolador para analisar os dados e enquadrá-los adequadamente, dentro ou fora da banda. Essa é uma solução melhor, pois esse protocolo sensível ao tempo deve exigir um RTOS. Mas, ainda assim, deve haver uma maneira de implementar isso em um sistema operacional normal.

Analisador lógico: (O primeiro e o segundo bytes NÃO SÃO constantes. Deduzi que o primeiro byte é um endereço (ou talvez um intervalo de tempo, e o segundo byte é um tipo de pacote).

questionAnswers(1)

yourAnswerToTheQuestion