Manipulação de erros UART

8

Não estou me concentrando em um MCU específico, pois o UART da maioria dos controladores tem arquitetura semelhante. Eles têm FIFOs para Tx e Rx.

Os erros mais comuns gerados pelo UART são: - 1. Erro de enquadramento 2. Erro de paridade 3. Erro de excesso de execução (estouro de FIFOs de Tx / Rx) 4. Erro de interrupção de recebimento (algum erro com bits de parada)

Como lidar com essas condições de erro para manter a comunicação corretamente?

Eu entendo que é uma pergunta vaga, mas na maioria das vezes as pessoas ficam confusas sobre o que se deve fazer quando esses erros ocorrem e acabam apenas limpando os bits de erro.

Swanand
fonte

Respostas:

6

Para realmente responder à sua pergunta, geralmente descarto qualquer coisa recebida com erro. Isso pode incluir a reinicialização do hardware UART, dependendo do erro e dos detalhes do hardware UART.

A única exceção é se você deseja receber deliberadamente pausas. Aqueles aparecem como erros de enquadramento. Nesse caso, você passa erros de enquadramento para os níveis mais altos como condições especiais. No entanto, isso exige que informações fora da banda sejam passadas para os níveis mais altos e, portanto, a interface do receptor UART não pode ser vista como algo tão simples quanto obter um fluxo de bytes. Acho que já fiz isso exatamente uma vez em muitos projetos de microcontroladores, porque tinha que ser compatível com um sistema antigo, onde as pausas eram usadas deliberadamente.

Steven deu a você algumas boas idéias sobre o que fazer sobre isso no nível mais alto. Quando você acha que há uma chance real de erros e a integridade dos dados é importante, geralmente você encapsula pedaços de dados em pacotes com somas de verificação. O receptor envia um ACK para cada soma de verificação recebida corretamente.

No entanto, a grande maioria das vezes os erros UART são tão improváveis ​​e não são absolutamente críticos que você pode ignorá-los em alto nível. O tipo de erro que o hardware UART pode detectar geralmente é devido à estupidez do operador, não ao ruído da linha. A maioria dos ruídos causará dados ruins, que o UART não detectará. Portanto, o driver UART de baixo nível lança qualquer coisa imediatamente associada a um erro UART, mas, caso contrário, continua a transmitir o fluxo de bytes recebidos até o próximo nível. De fato, isso é feito mesmo se você estiver usando pacotes e somas de verificação, pois isso é feito em um nível mais alto do que onde bytes individuais são recebidos.

Olin Lathrop
fonte
9

Como esses erros não podem ser corrigidos, é necessário retransmissão. Isso precisa de algum protocolo em um nível superior ao UART; você normalmente deseja confirmar a recepção correta de um pacote de dados. Este pacote pode ter 1 byte, mas também pacotes mais longos podem ser usados ​​se a comunicação apresentar poucos erros. Reconheça cada pacote enviando um ACK ao transmissor, um NACK se ocorrer um erro. Neste último caso, descarte o pacote e aguarde a retransmissão.
Se você usar transferências de pacotes, considere a verificação de erros CRC em vez da paridade, o que não é muito eficiente (adiciona 1 bit por byte) e captura apenas erros de bit único.

stevenvh
fonte
3

Quando há um erro de enquadramento nos dados UART recebidos, é provável que todos os bytes seguintes sejam lixo até que, dependendo do UART, haja dez ou mais tempos de bits entre as bordas de queda consecutivas no fio de dados, dezenove vezes em bits de espaçamento consecutivo ou nove bits vezes de marcação consecutiva (a última delas funcionará em todos os UARTs). Se alguém recebe um byte com estrutura correta com o valor 0x00 ou 0x80 (0x100 no modo de 9 bits) e o transmissor não envia pausas longas ou o receptor para de tentar analisar bytes de qualquer pausa longa que o transmissor enviar, pode-se tenha certeza de que está correto e os bytes seguintes também estarão corretos. Se alguém recebe um valor no qual existem 0-6 "zeros" consecutivos nos bits inferiores e os bits restantes estão todos definidos,

S = INÍCIO P = dados anteriores do byte s = parada D = byte atual - = inativo
0111111101000000011111 - Sinal online
Ps ------ SDDDDDDDDs ---: conforme pretendido pelo transmissor (0x02)
SPPPPPPPPsSDDDDDDDDs-: Como recebido (0xC0)

Se cada pacote começar com 0x00 e for seguido por 0xFF, um erro de enquadramento em um pacote não afetará o próximo. Quando o receptor percebe o erro de enquadramento, ele pode começar a descartar dados até ver um 0x00 com o enquadramento adequado, e então saberá que possui um início legítimo de pacote.

supercat
fonte