Rilevamento del bit di avvio nel software UART


9

Sto sperimentando la scrittura di un software UART sul mio microcontrollore utilizzando pin GPIO. Questo per aggiungere temporaneamente un canale UART a un progetto fino a quando non avremo implementato il nuovo design che utilizza un uC con più porte UART.

Ciò con cui ho difficoltà è rilevare correttamente un bit di avvio in un flusso seriale. La fonte del flusso è esterna e non importa quando il mio dispositivo si accende. Quindi è molto probabile che il mio dispositivo si accenda e inizi a vedere bit di dati nel mezzo di una trasmissione di byte. Indubbiamente, questo farà sì che il mio software UART legga valori errati, in quanto non sarà in grado di dire la differenza tra un bit di inizio e qualsiasi altra transizione dall'alto verso il basso.

È un problema inevitabile con un canale UART? O c'è qualche trucco intelligente che i produttori di UC usano nei loro UART hardware?


Buona domanda. Il tuo dispositivo esterno invia continuamente personaggi? In caso contrario, è necessario verificare se il bit iniziale e quello finale sono allineati. E se i dati in mezzo corrispondono al tuo controllo (somma / bit)?
Paul,

Puoi fare in modo che il flusso UART esterno invii un preambolo? Come un flusso di dati speciali per indicare un flusso in arrivo che sarebbe distinto da un bit di inizio? Se potessi farlo, allora saresti in grado di dire se i dati sono errati se dovessi accenderti nel mezzo di una trasmissione o meno.
Funkyguy,

1
Se il flusso seriale non contiene alcun periodo di inattività sufficientemente lungo, è improbabile che tu possa ripristinarti da questo. Una soluzione parziale può verificarsi nel caso in cui non si riceva il bit di "stop" dove previsto. Quindi sarà possibile ripristinare lo stato e riprovare.
Eugene Sh.

1
Non hai bisogno di un preambolo speciale ... solo un riposo occasionale più lungo di un carattere (incluso inizio, stop bit). Oppure, 10+ stop bit di fila, che è la stessa cosa.
Brian Drummond,

2
@Fuaze, il dispositivo esterno invia continuamente un lungo flusso di caratteri, ma occasionalmente rimane inattivo. Nel peggiore dei casi, posso semplicemente ignorare l'input fino alla prima volta che è inattivo.
Dan Laks,

Risposte:


5

Se si utilizza una lunghezza di bit di arresto facilmente discernibile dal resto del flusso di dati, ad esempio un tempo di 1,5 bit, dovrebbe essere facile iniziare a ricevere la trasmissione intermedia. Tuttavia, ciò comporta un costo di spese generali maggiori. Il throughput totale dei dati disponibili ne risentirà all'aumentare della lunghezza del bit di stop.

Se non stai usando il bus in modo così pesante, e spesso hanno degli spazi tra i frame, allora potrebbe essere solo una questione di aspettare che si verifichi uno di questi spazi, e quindi raccogliere la prima trasmissione hi-lo come l'inizio del tuo prossimo inizio bit.

Tieni presente che il numero di bit di dati dovrebbe essere prevedibile, così come le dimensioni del frame, quindi anche se stai utilizzando il 100% della capacità del bus e il tuo bit di stop è un singolo bit, dovresti comunque essere in grado di trovare il iniziare a bit se si raccolgono abbastanza frame. È garantito che ogni frame abbia una transizione hi-lo. Il bit di stop è quello che è sempre alto. Il bit di avvio è sempre basso. Supponendo che i tuoi dati siano casuali (o abbastanza casuali), potresti fare qualcosa di semplice come creare un buffer delle dimensioni del tuo frame, impostare ogni bit in esso, quindi continuare a raccogliere frame e ANDarli in questo buffer fino a quando il buffer ha solo 1 bit set. Questo bit è il tuo bit di stop. Quello dopo è il tuo bit di partenza. Ecco! L'hai trovato

Se si utilizza un bit di parità, un'altra opzione sarebbe quella di acquisire due frame di dati, selezionare il primo bit basso come bit di inizio, quindi calcolare il checksum e confrontarlo con il bit di parità. Se corrisponde, allora hai (probabilmente) trovato il bit di inizio. In caso contrario, scegli il prossimo bit basso e ripeti fino a ottenere un buon checksum. Se non riesci a trovare un po 'nei tuoi due frame di dati che vengono estratti come bit di inizio validi, i tuoi dati sono stati danneggiati e dovrai prendere altri due frame.


Un'idea chiara per AND insieme i frame finché non sopravvivono solo i bit di inizio e fine. Sarà troppo sovraccarico per la mia specifica applicazione, ma comunque intelligente.
Dan Laks,

Se il dispositivo esterno è qualcosa su cui l'OP non ha alcun controllo (cosa che ha affermato in un precedente commento alla domanda), è improbabile che sarà in grado di modificare la lunghezza del bit di stop.
Tcrosley,

Quel commento non era stato fatto quando ho iniziato a scrivere questa risposta. Tuttavia, le altre tre opzioni che ho elencato si applicano ancora nel caso in cui la lunghezza del bit di stop sia fissa.
Dr. Funk,

3

Gli UART hardware hanno lo stesso problema. Ma di solito è uno che si risolve da solo in breve tempo. Alla fine di ogni fotogramma, controlla il bit di stop e, se non è alto, scarta il fotogramma e attendi la successiva transizione da alto a basso. Supponendo che i dati dalla sorgente non siano totalmente patologici (ad esempio, lunghe stringhe di "UUUU" o ASCII 0x55), l'UART alla fine "camminerà" da solo verso il bit di inizio reale.


1

Supponendo la trasmissione 8N1.

È necessario attendere una stringa di 9 bit alti o bassi di fila.

Se alto indica un gap inattivo nei dati o un carattere 0xFF e bit STOP
o
se basso un bit START e un carattere NULL 0x00.

Una di queste condizioni consentirà la risincronizzazione.

Per accelerare: se conosci determinati caratteri che non sono possibili nei dati, puoi analizzare i dati in arrivo ripetutamente (dopo il fatto) per ogni bit e se ottieni una serie di 7 caratteri senza senso (set di bit alto, inferiore caso, codici di controllo, punteggiatura o altro) seguito da un carattere valido, puoi essere abbastanza sicuro di essere risincronizzato.

Avrai i problemi simili quando usi una periferica UART integrata e non riesci a fare una valutazione bit a bit e devi anche ricordare di ripristinare tutti i bit di errore dell'inquadramento e simili ogni volta che si verificano (specialmente all'accensione).

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.