Estou experimentando escrever um software UART no meu microcontrolador usando pinos GPIO. Isso é para adicionar temporariamente um canal UART em um projeto até obtermos o novo design implementado que usa um uC com mais portas UART.
Estou com dificuldade em detectar corretamente um bit de início em um fluxo serial. A fonte do fluxo é externa e não se importa quando meu dispositivo é ligado. Portanto, é muito provável que meu dispositivo seja ligado e comece a ver bits de dados no meio de uma transmissão de bytes. Sem dúvida, isso fará com que o UART do meu software leia valores incorretos, pois não será capaz de diferenciar um bit de início e qualquer outra transição de alto para baixo.
Esse é um problema inevitável com um canal UART? Ou existe algum truque inteligente que os fabricantes de uC usam em seus UARTs de hardware?
Respostas:
Se você usar um tamanho de bit de parada que seja facilmente discernido do restante do fluxo de dados, como um tempo de 1,5 bits, será fácil começar a receber a transmissão intermediária. No entanto, isso tem um custo de sobrecarga aumentada. Seu rendimento total de dados disponível sofrerá à medida que você aumentar a duração do seu bit de parada.
Se você não estiver usando o barramento com muita freqüência e com intervalos entre os quadros, pode ser apenas uma questão de esperar que um desses intervalos ocorra e depois pegar a primeira transmissão oi-lo no início do seu próximo bit de início.
Lembre-se de que o número de bits de dados deve ser previsível, assim como o tamanho do quadro, portanto, mesmo se você estiver usando 100% da capacidade do barramento e seu bit de parada for um único bit, ainda será possível encontrar o bit de início se você coletar quadros suficientes. É garantido que todos os quadros tenham uma transição oi-lo. O bit de parada é aquele que está sempre alto. O bit inicial é aquele que é sempre baixo. Supondo que seus dados sejam aleatórios (ou aleatórios o suficiente), você pode fazer algo tão simples quanto criar um buffer do tamanho do seu quadro, definir cada bit nele e continuar coletando quadros e ANDando-os nesse buffer até que o buffer tenha apenas 1 conjunto de bits. Este bit é o seu bit de parada. O seguinte é o seu bit de início. Voila! Você encontrou.
Se você estiver usando um bit de paridade, outra opção seria coletar dois quadros de dados, escolher o primeiro bit baixo como o bit inicial e calcular a soma de verificação e comparar com o bit de paridade. Se corresponder, você (provavelmente) encontrou o bit inicial. Caso contrário, escolha o próximo bit baixo e repita até obter uma boa soma de verificação. Se você não conseguir encontrar um bit em seus dois quadros de dados com check-out válido, então seus dados foram corrompidos e você precisará pegar mais dois quadros.
fonte
UARTs de hardware têm o mesmo problema. Mas geralmente é aquele que se resolve em pouco tempo de qualquer maneira. No final de cada quadro, verifique o bit de parada e, se não estiver alto, descarte o quadro e aguarde a próxima transição de alto para baixo. Supondo que os dados da fonte não sejam totalmente patológicos (por exemplo, seqüências longas de "UUUU" ou ASCII 0x55), o UART acabará "caminhando" até o bit de início real.
fonte
Assumindo transmissão 8N1.
Você deve esperar por uma sequência de 9 bits altos ou baixos seguidos.
Se alto, isso significará uma lacuna ociosa nos dados ou um caractere 0xFF e um bit STOP
ou,
se for baixo, um bit START e um caractere NULL 0x00.
Qualquer uma dessas condições permitirá ressincronização.
Para acelerar: Se você conhece certos caracteres que não são possíveis nos dados, você pode analisar os dados recebidos repetidamente (após o fato) de cada bit e se obtiver uma série de 7 caracteres sem sentido (conjunto de bits alto, menor maiúsculas e minúsculas, códigos de controle, pontuação ou o que for) seguido de um caractere válido, você pode ter certeza de que está ressincronizado.
Você terá os mesmos problemas ao usar um periférico UART interno e não poderá fazer a avaliação bit a bit, além de lembrar de redefinir todos os bits de erro de estrutura sempre que ocorrerem (especialmente na inicialização).
fonte