Gestione degli errori UART


8

Non mi sto concentrando su un MCU specifico poiché UART della maggior parte dei controller ha un'architettura simile. Hanno FIFO sia per Tx che per Rx.

Gli errori più comuni generati da UART sono: - 1. Errore di frame 2. Errore di parità 3. Errore di over-run (Overflow di FIFO Tx / Rx) 4. Errore di interruzione della ricezione (alcuni errori con bit di stop)

Come si dovrebbero gestire queste condizioni di errore per mantenere correttamente la comunicazione?

Capisco che è una domanda vaga ma la maggior parte delle volte le persone si confondono su cosa si dovrebbe fare quando si verificano tali errori e finiscono per cancellare solo i bit di errore.

Risposte:


6

Per rispondere effettivamente alla tua domanda, di solito scarto qualsiasi cosa ricevuta con errore. Ciò può includere la reinizializzazione dell'hardware UART, a seconda dell'errore e dei dettagli dell'hardware UART.

L'unica eccezione è se si desidera ricevere deliberatamente pause. Quelli si presentano come errori di inquadratura. In tal caso, si verificano errori di inquadratura fino ai livelli superiori come condizioni speciali. Tuttavia, ciò richiede che le informazioni fuori banda vengano passate ai livelli più alti e quindi l'interfaccia del ricevitore UART non può essere vista come qualcosa di così semplice come ottenere un flusso di byte. Penso di averlo fatto esattamente una volta in molti progetti di microcontrollori perché doveva essere compatibile con un vecchio sistema in cui le interruzioni venivano utilizzate deliberatamente.

Steven ti ha dato alcune buone idee su cosa fare al più alto livello. Quando pensi che ci sia una reale possibilità di errori e l'integrità dei dati è importante, di solito incapsuli blocchi di dati in pacchetti con checksum. Il destinatario invia un ACK per ogni checksum ricevuto correttamente.

Tuttavia, la stragrande maggioranza delle volte gli errori UART sono così improbabili e non assolutamente critici che puoi semplicemente ignorarli ad alto livello. Il tipo di errori che l'hardware UART può rilevare è generalmente dovuto alla stupidità dell'operatore, non al rumore di linea. La maggior parte del rumore simile causerà dati errati, che UART non rileverà. Pertanto, il driver UART di basso livello elimina qualsiasi cosa immediatamente associata a un errore UART, ma altrimenti continua a passare il flusso di byte ricevuti al livello successivo. In effetti lo fa anche se si utilizzano pacchetti e checksum poiché ciò avviene a un livello superiore rispetto a quello in cui vengono ricevuti i singoli byte.


9

Questi errori non possono essere corretti, quindi è richiesta la ritrasmissione. Ciò richiede un protocollo a un livello superiore rispetto a UART; in genere vorrai riconoscere la corretta ricezione di un pacchetto di dati. Questo pacchetto può essere di 1 byte, ma è possibile utilizzare anche pacchetti più lunghi se la comunicazione presenta piccoli errori. Riconoscere ciascun pacchetto inviando un ACK al trasmettitore, un NACK se si è verificato un errore. In quest'ultimo caso, scartare il pacchetto e attendere la ritrasmissione.
Se si utilizzano i trasferimenti di pacchetti, è possibile prendere in considerazione la verifica degli errori CRC anziché la parità, che non è molto efficiente (aggiunge 1 bit per byte) e rileva solo errori a bit singolo.


3

Quando si verifica un errore di framing nei dati UART ricevuti, le probabilità sono buone che tutti i byte successivi diventeranno spazzatura fino a quando, a seconda dell'UART, ci sono dieci o più bit bit tra i fronti discendenti consecutivi sul filo dati, diciannove volte di spaziatura consecutiva, o nove bit per volta di marcatura consecutiva (l'ultimo di questi funzionerà su tutti gli UART). Se si riceve un byte correttamente incorniciato con valore 0x00 o 0x80 (0x100 in modalità 9 bit) e il trasmettitore non invia interruzioni lunghe o il ricevitore smetterà di tentare di analizzare i byte da qualsiasi interruzione lunga inviata dal trasmettitore, si può essere certi che sia corretto e anche i byte successivi saranno corretti. Se uno riceve un valore in cui ci sono 0-6 "zero" consecutivi nei bit inferiori e tutti i bit rimanenti sono tutti impostati,

S = START P = dati byte precedenti s = stop D = byte corrente - = inattivo
0111111101000000011111 - Segnale in linea
Ps ------ SDDDDDDDDs ---: come previsto dal trasmettitore (0x02)
SPPPPPPPPsSDDDDDDDD-: Come ricevuto (0xC0)

Se ogni pacchetto inizia con 0x00 ed è seguito da 0xFF, un errore di framing su un pacchetto non influirà sul successivo. Quando il destinatario nota l'errore di framing, può iniziare a scartare i dati fino a quando non vede un 0x00 correttamente incorniciato, dopodiché saprà che ha un inizio legittimo del pacchetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.