Domanda:
Bit di avvio nelle comunicazioni seriali asincrone
brenzo
2017-03-21 22:17:48 UTC
view on stackexchange narkive permalink

Comprendo concettualmente la comunicazione seriale sincrona, ma ho problemi con il funzionamento dell'asincrono.Nello specifico in questa situazione:

Diciamo che voglio inviare un byte: 0x03.Abbiamo un bit di inizio e uno di arresto, che sono rispettivamente basso e alto.Come fa il dispositivo ricevente a "sapere" che sto inviando un bit di inizio seguito da 6 0?Come fa a sapere che non è solo un bit di inizio lungo?

Followup: cos'è esattamente un UART?Mi chiedo qual è l'uso comune, poiché ho visto vari luoghi chiamarlo standard e altri come un componente hardware.

Con rarissime eccezioni, i dati seriali sono ** i primi bit meno significativi **, quindi 0x03 (8 bit senza parità) è inizio = L 1 = H 1 = H 0 = L 0 = L 0 = L 0 =L 0 = L 0 = L arresto = H
Cinque risposte:
Olin Lathrop
2017-03-21 22:36:59 UTC
view on stackexchange narkive permalink
Come fa il dispositivo ricevente a "sapere" che sto inviando un bit di inizio seguito da 6 0? Come fa a sapere che non è solo un bit di inizio lungo?

Perché con questo tipo di comunicazione, sia il mittente che il destinatario devono concordare in anticipo alcuni parametri. I due parametri chiave qui sono la velocità di trasmissione e il numero di bit di dati.

La linea inizia nel livello inattivo. Il trasmettitore invia prima il bit di avvio, che si trova al livello opposto. Quindi invia i bit di dati, seguiti dal bit di stop.

A differenza di quanto hanno detto altri, il bit di stop non è un checksum. È necessario in modo che ci sia sempre una transizione sul fronte di salita del bit di inizio. Altrimenti, se l'ultimo bit di dati del carattere precedente fosse della stessa polarità di un bit di inizio, il ricevitore non sarebbe in grado di vedere il bit di inizio se un nuovo carattere fosse inviato immediatamente. Il bit di stop è essenzialmente il tempo di inattività della riga tra i caratteri. Questo tempo viene utilizzato anche per assorbire una mancata corrispondenza dell'orologio tra il mittente e il destinatario.

Quando è inattivo, il ricevitore controlla la linea cercando di passare allo stato non inattivo. Quando ciò accade, avvia un cronometro. Poiché è configurato per lo stesso bit rate del trasmettitore, sa quando viene inviato ogni bit di dati, se differisce da un bit precedente o meno. La metà del primo bit di dati è a 1½ bit dal fronte di salita del bit di inizio. Il secondo a 2½ bit, ecc.

Dopo aver ricevuto l'ultimo bit di dati, il ricevitore attende che la linea torni allo stato inattivo, quindi attende di nuovo il bit di avvio successivo.

Un UART è un dispositivo che fa tutto questo per trasmettere e ricevere i tempi per te.Si configura l'UART per la velocità di trasmissione che si utilizzerà, il numero di bit di dati e alcuni altri parametri.Dopodiché, di solito gli dai byte interi e si occupa di eliminare i bit.Per la ricezione, rileva il bit di inizio, esegue i tempi, afferra i bit e ti fornisce un byte su un piatto d'argento, spesso con alcune informazioni di stato aggiuntive opzionali.

Mi scuso ... quando ho modificato ciò che avevo scritto e pubblicato, la tua risposta è apparsa allo stesso tempo, e posso vedere anche senza leggere ogni parola che ho inavvertitamente duplicato molto di ciò che hai scritto.
@Randy: Non ci sono problemi.Ecco come funziona il sito.
Va bene, grazie, ora ha molto più senso.Mi sembrava un problema con la gallina e le uova.Quindi, ad esempio, se volessi parlare con un chip con RS-232 fuori dalla scatola, sarebbe mia responsabilità leggere la sua scheda tecnica e configurare il mio trasmettitore per quel baud?
@Bren: Sì, e il baud rate non è l'unico parametro.Per configurare correttamente RS-232, è necessario conoscere la velocità di trasmissione, il numero di bit di dati e se viene utilizzato un bit di parità aggiuntivo.Apparecchiature meccaniche molto vecchie (telescriventi degli anni '60) a volte richiedevano 1 1/2 o 2 bit di stop in modo che il meccanismo avesse il tempo di ripristinare l'attesa del carattere successivo.La configurazione RS-232 più comune oggi è 8 bit di dati, nessun bit di parità e 1 bit di stop, spesso abbreviato "8-N-1".Le velocità di trasmissione variano.Oggi, 9600, 19,2k e 115,2k baud sono i più comuni, ma altri si trovano ancora occasionalmente.
[Eric Raymond] (http://www.catb.org/esr/faqs/things-every-hacker-once-knew/) nota che il prefisso "AT" aveva una proprietà speciale utile.Quella sequenza di bit (1 + 0 1000 0010 1 + 0 0010 1010 1+, dove il suffisso più indica una o più ripetizioni del bit precedente) ha una forma che lo rende il più semplice possibile per un ricevitore riconoscerlo anche se ilil ricevitore non conosce la velocità della linea di trasmissione;questo, a sua volta, rende possibile [sincronizzarsi automaticamente a quella velocità] (http://esr.ibiblio.org/?p=7333&cpage=1#comment-1802568).
@Brennan _ "Sarebbe mia responsabilità leggere la sua scheda tecnica e configurare il mio trasmettitore per quel baud? _" Non esattamente.Non è un caso in cui ogni UART ha una velocità in bit specifica (anche se hanno un massimo).Il bit rate è determinato dalla programmazione dell'UART.L'API della porta seriale nel tuo sistema operativo ti dà un modo per farlo, cioè impostare la velocità in bit, il numero di bit di dati, ecc. Devi impostarli in modo che corrispondano a ciò che si aspetta il _sistema_ dall'altra parte.I terminali asincroni vecchio stile avevano una manopola o un'opzione di configurazione per questo.(N.B .: "velocità di trasmissione" è davvero un termine errato; è come dire "velocità di trasmissione")
@Brennan: Non il "chip" ma il dispositivo.Ad esempio, un mouse avrà una velocità di trasmissione diversa da un modem che avrà una velocità di trasmissione diversa da una macchina a raggi X che avrà una velocità di trasmissione diversa da un sensore di temperatura industriale.I dispositivi specificheranno le impostazioni UART come 1200, 8N1 o 9600, 8E1.Il numero grande è la velocità di trasmissione, l'8 significa che i dati sono 8 bit (alcuni dispositivi specificheranno 7 bit), N o E o O o M o S non specificano alcuna parità o parità dispari o parità dei contrassegni (paritàsempre 1) o parità di spazio (parità sempre 0) e 1 specifica 1 bit di stop (a volte 2)
@Brennan Inoltre, alcuni dispositivi avranno il rilevamento automatico della velocità di trasmissione e ti diranno di inviare byte magici come "0x55" o "" AT "" che è "0x41, 0x54" immediatamente dopo aver acceso il dispositivo
Dettagli su "Dopo aver ricevuto l'ultimo bit di dati, il ricevitore attende che la linea ritorni allo stato di inattività" Il bit di stop viene campionato vicino al suo _middle_.A questo punto, la linea è nel suo stato inattivo (stop e inattivo sono gli stessi).Il ricevitore è quindi pronto per un altro "byte" (1 + N + 0,5) bit dopo l'avvio.Questo gestisce l'inclinazione dell'orologio del mittente / destinatario.
Randy
2017-03-21 23:13:24 UTC
view on stackexchange narkive permalink

Funziona così. Con la comunicazione Async, la parte ricevente di solito deve già conoscere la velocità di trasmissione, che è abbastanza vicina da significare semplicemente "bit al secondo" per la nostra discussione. Quindi abbiamo uno stato "normale" o "a riposo" della linea di comunicazione a terra che sarà effettivamente lo stesso stato del bit "stop" (questo avrà più senso in un minuto).

Ora, se tu, come ricevitore, "sai" quale dovrebbe essere la velocità (Baud o BPS), puoi organizzare un circuito che si attivi quando rileva una transizione a un nuovo stato. Bene, poiché questo nuovo stato è l'opposto dello stato "a riposo", ora SAPETE che viene trasmesso un byte. Quindi, dato che "conosci" la velocità, puoi calcolare il tempo necessario per il completamento, giusto? Quindi, quando il ricevitore rileva questa transizione, deve attendere 1-1 / 2 del tempo di un po ', quindi esaminare il nuovo stato. Il primo tempo di bit "1" per attendere fino al completamento del bit di inizio "1" e il secondo tempo di bit "1/2" è per garantire che quando si guarda lo stato del primo bit di dati, si sta "campionando" proprio nel mezzo di quel bit.

Quindi, a questo punto, il ricevitore campionerà lo stato, memorizzerà il bit in un registro a scorrimento, attenderà un altro bit completo, campionerà nuovamente lo stato. A quel punto sposterebbe l'ultimo bit registrato di una posizione e memorizzerebbe il nuovo bit. Questo processo continua fino al completamento di un numero di bit concordato in precedenza. (Probabilmente 8, ma non deve essere!) A quel punto hai registrato l'intero byte (o parola) in arrivo.

Potrebbe esserci o meno un bit di "parità" aggiuntivo, sempre a seconda dei parametri concordati tra trasmettitore e ricevitore. Se è presente un bit di parità, il processo di spostamento / campionamento continua ancora una volta. Viene quindi eseguito un semplice calcolo per contare il numero di bit "1" nella parola registrata e vedere se il totale è pari o dispari e confrontare il risultato con il bit di parità rilevato. (non sorprendentemente, la risposta corretta dipende dal fatto che la parità "dispari" o "pari" sia il formato concordato).

Ora il bit "stop" è meno di una scienza esatta, motivo per cui a volte vedi opzioni per bit "stop" che vanno da "1" (come minimo) fino a 2, a volte includendo un 1-1 / 2 come un opzione. Il bit di stop (o bit) è semplicemente la quantità di tempo che il ricevitore spera di avere per spostare l'ultimo byte nel buffer di byte che sta ricevendo, ed essere reimpostato e pronto a ricevere un altro byte. Ecco perché il bit "stop" è semplicemente un ritorno allo stato "a riposo".

Infine, un UART (ricevitore e trasmettitore asincrono universale) è un circuito, spesso fornito come parte separata o come caratteristica incorporata in un microprocessore. Normalmente vi permetterà di programmare tutti quei parametri "attesi", velocità di trasmissione, bit di inizio e fine, opzioni di parità ed è in grado di gestire l'intera sequenza di rilevamento dello stato, campionamento e un registro a scorrimento per ricevere o inviare un byte. Avrà anche caratteristiche interessanti che ti permetteranno di controllare la velocità di campionamento dei bit. In genere, un UART fornirà anche un interrupt e un "vettore" di programma, in modo che quando viene ricevuto un byte, il processore di controllo può immediatamente rispondere e memorizzare il byte.

Infine, anche se non hai chiesto, ci sono anche dispositivi USART, che fondamentalmente offrono tutte le funzionalità di un UART, ma aggiungono in aggiunta le capacità necessarie per la comunicazione SYNCHRONUS.

"Il bit di stop ... è semplicemente la quantità di tempo che il ricevitore spera di ... essere resettato e pronto a ricevere un altro byte." Quasi.Il ricevitore deve essere pronto circa dopo la metà dell'ultimo bit di stop affinché il bit di avvio successivo possa far fronte allo skew dell'orologio del mittente / destinatario.
Sono d'accordo @chux, ma avendo lavorato su questa roba ai giorni di apparecchiature MOLTO vecchie, mi è sempre sembrato che l'ampia gamma di opzioni di bit di stop sul lato di trasmissione (a volte fino a 5!) Fosse dovuta a problemi di progettazione imprevisti sullato ricevitore.Ad esempio, se l'UART del destinatario (o equivalente) veniva "interrogato" da un processore più occupato del previsto, l'aggiunta di più bit di STOP sul lato mittente era una buona strategia per compensare.Il produttore dell'hardware del ricevitore potrebbe aver specificato un bit di stop, ma non ha sempre calcolato ritardi aggiuntivi causati da software lento.
Trevor_G
2017-03-21 22:21:20 UTC
view on stackexchange narkive permalink

La comunicazione asincrona si basa sulla correttezza della velocità di trasmissione.Il bit di inizio dice al ricevitore di controllare il livello di bit ogni tempo BIT definito dalla velocità di trasmissione.

Quindi il ricevitore viene sostanzialmente interrotto dal bit di inizio e inizia a interrogare la linea del segnale ogni volta in seguito per ricevere i bit successivi.

Il bit di stop è come un checksum e garantisce anche uno spazio tra ogni byte di dati.Si aspetterà di vedere quello o quei bit in uno stato definito.In caso contrario, viene generata una condizione di errore.

Un UART, ricevitore / trasmettitore asincrono universale, è l'hardware della macchina a stati che racchiude tutte queste funzionalità.

Se si seleziona una velocità di trasmissione o un formato diverso da quello previsto dal ricevitore, la comunicazione non riuscirà.

old_timer
2017-03-22 04:54:28 UTC
view on stackexchange narkive permalink

Hai ragione sul fatto che ci sono modelli che assomigliano a molti bit di inizio o bit di stop. Lo stop per iniziare è una transizione nota (come Olin ha indicato il motivo del bit di stop) ma se i dati si muovono alla velocità di linea e un ricevitore arriva nel mezzo da qualche parte, potrebbero essere necessari molti simboli prima che il ricevitore possa trovare uno stop per iniziare transizione di bit che il numero concordato di bit successivamente termina in un altro bit di stop. È facile creare schemi che, se si inviano ripetutamente alla velocità di linea, il ricevitore potrebbe bloccarsi sullo stop sbagliato per avviare la transizione e decodificare i dati in modo errato. I bit di parità aiutano in questo, ma non sono infallibili, si risolvono solo facendo variare i dati nel tempo o forzando periodi di inattività di tanto in tanto.

Se hai troppi bit di inizio in una riga, si tratta di una "interruzione" che è un errore di framing ma un errore di framing specifico che a volte viene utilizzato intenzionalmente.

È considerato asincrono in quanto ogni lato ha il proprio orologio, i messaggi sono abbastanza brevi da poter essere fuori di un bel po 'ed estrarre ancora circa 8-10 bit. Gli uart tipici avranno un sovracampionamento 8 o 16 volte, quindi diciamo che sono sovracampionati 8 volte, quindi ci sono 8 periodi di clock per tempo di bit e se il fronte di inizio è sul conteggio 2 del sovracampionamento, allora per i successivi tanti bit campionate sul conteggio 6 che sarebbe cella di bit di offerta, devi solo essere buono per 10 o più celle di bit. Potresti persino regolare la tua logica se ci sono transizioni se non tutte uno o tutti zeri e arrivi a metà e vedi un vantaggio sul conteggio 1 invece di contare 2 sulla tua logica di sovracampionamento, quindi puoi campionare le prossime celle su contare 5 invece di 6 per mettere a punto la parte centrale della cella di bit. Molto tipico per i dati continui da continuare a regolare, per il seriale quando in genere diciamo 10 o 11 bit per simbolo / carattere, è possibile che i clock di sorgente e ricevitore siano un po 'fuori e funzionino ancora abbastanza bene.

chux - Reinstate Monica
2017-03-22 09:00:51 UTC
view on stackexchange narkive permalink

Altre risposte spiegano bene il campionamento a livello di bit, ma volevo spiegare in modo più approfondito le attività di sub-bit e i dettagli sull'inclinazione e la fase dell'orologio.


come funziona l'asincrono.

Il mittente e il retriever concordano sul formato: un frame di 1 bit di inizio, N bit di dati, parità opzionale e 1, 1,5 o 2 bit di stop.

Sono d'accordo su una velocità di comunicazione comune approssimativa come 1 / 115.200 secondi per "bit" o baud. Ogni lato esegue il proprio orologio. Il risultato è che gli orologi potrebbero essere leggermente diversi l'uno dall'altro. Legge di Segal. In teoria, è consentita una differenza di circa il 10%, in pratica è più del 5%.

Eppure un elemento importante della condivisione di do not è la fase dei loro orologi. Anche se sia il mittente che il destinatario avevano frequenze di clock identiche, la relazione di fase tra i clock di mittente / destinatario non è controllata. Con orologi quasi identici, questa fase cambia lentamente.


Per far fronte a questa differenza di fase , il ricevitore campiona a una velocità maggiore del baud. Supponiamo che 16 volte più velocemente.

Un ricevitore si sveglia per guardare il suo ingresso, che sta campionando a 16x baud. Se l'input non è inattivo, attende che la linea sia inattiva per un po '.

Una volta che l'ingresso è in stato di inattività (nessun dato inviato), il ricevitore cerca una transizione campione allo stato attivo. Una volta rilevato, un buon ricevitore cerca anche 1/2 bit di tempo (8x campioni) in un secondo momento per uno stato attivo continuo. Se viene rilevato, viene rilevato un bit di stato e viene rilevata la fase (entro 1/16 di bit) dei dati in ingresso. In caso contrario, il segnale spurio viene solitamente ignorato silenziosamente e il ricevitore lo rifiuta come rumore e ricomincia come sopra.

I successivi N campioni, eseguiti a piena larghezza di bit dall'offset di 1/2 bit del bit iniziale, presumono che la linea sia dati e che viene letto il valore da LSbit a MSbit.

A volte è incluso un bit di parità.

Infine i successivi 1 (o raramente 2) bit vengono campionati (al centro) e dovrebbero essere nello stato inattivo. In caso contrario, si dice che il frame ricevuto ha un errore di bit di stop o errore di frame . Un bit di inizio lungo è uno speciale errore di inquadratura chiamato interruzione .

Dopo che l'ultimo bit di stop è stato campionato, quasi al centro, il ricevitore è immediatamente pronto per un altro bit di start. Ciò consente agli orologi del mittente e del destinatario di essere fino a circa il 5-10% di sconto l'uno dall'altro e la comunicazione riesce.

Come fa il dispositivo ricevente a "sapere" che sto inviando un bit di inizio seguito da 6 0?

Nel caso di OP, inviando x03 o b0000-0011, dopo che la linea è rimasta inattiva (stato 1-1-1-1 -...) per un po 'e il ricevitore è pronto, il mittente emette uno 0 iniziale, 1-1-0-0-0-0-0-0, bit di stop 1. Il ricevitore rileva il bit di avvio, i dati e il bit di stop. Successo!


Attributi aggiuntivi, non coperti, includono il sovracampionamento dei dati con rilevamento della maggioranza, interruzione, dettagli di parità, protocolli di livello superiore, rilevamento automatico del baud e così via.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...