Domanda:
In che modo UART conosce la differenza tra bit di dati e bit di avvio / arresto?
Ben Hershey
2016-08-09 00:41:03 UTC
view on stackexchange narkive permalink

Capisco che è comune per uno schema UART utilizzare 8N1, ovvero 1 bit di inizio, 8 bit di dati e 1 bit di stop. Qualcosa di simile:

0 xxxxxxxx 1

Dove 0 è il bit di inizio, le x sono i dati e 1 è il bit di stop. Nel caso di più frame inviati continuamente indietro, avresti qualcosa del genere:

0 xxxxxxxx 10 xxxxxxxx 10 xxxxxxxx

La mia domanda è: come può il ricevitore capire la differenza tra i bit di inizio / fine e i bit di dati? Per illustrare questo punto, supponiamo che il byte di dati 0xAA sia ancora e ancora. Avrebbe il seguente aspetto:

0 10101010 10 10101010 10 10101010 10 10101010 10 10101010 1

Ho reso i bit di inizio / fine in grassetto per enfatizzare, ma mi sembra che non ci sia davvero modo di distinguerli dai bit di dati .

Certo, se il ricevitore ha avuto una connessione solida e priva di errori al trasmettitore dall'eternità, allora posso vedere come questo non sarebbe un problema. O se i byte non vengono rimandati indietro, non sarebbe un problema. Ma ho lavorato con circuiti 8N1 che trasmettevano continuamente byte uno dopo l'altro, e potevo scollegare / ricollegare i fili a metà trasmissione e il ricevitore sarebbe sempre tornato a ricevere correttamente. Com'è possibile?

Non può e in un flusso continuo come quello avrai un problema.È necessario un ritardo tra i byte o un altro metodo per "inquadrare" i byte.
è molto facile per l'uart sincronizzarsi in modo sbagliato e rimanere sbagliato per un po ', ci sono modelli che puoi inviare continuamente che se si blocca in modo sbagliato rimarrà sbagliato.Idealmente i dati stanno cambiando e occasionalmente ci sono periodi di inattività, in una situazione del genere l'Uart finirà per risolvere gli errori di inquadratura del blocco dei dati invece della sincronizzazione, e quindi alla fine scivolerà nel modello giusto.È un protocollo tutt'altro che perfetto, ma funziona abbastanza bene.Ce ne sono molti altri che non sono così inclini all'errore.
Funziona come ti aspetteresti e come suggerisce il riepilogo generale della maggior parte delle risposte.Assumere nessun controllo di parità, 1 inizio, 1 inizio, dati a 8 bit.RX inattivo e pronto a ricevere, line = high = idle.|L'RX inizierà il 1 ° 0. |1,5 bit volte dopo la modifica 1/0, campionerà il primo bit e lo farà 8 volte.|Successivamente, campionerà il bit di arresto, si spera, di 1 bit.-> ORA se il bit di stop = 1 = valido attenderà la successiva transizione 1/0 (propriamente> = 1 bit di tempo dopo l'inizio del bit di stop valido E se i dati così ricevuti sono spazzatura non lo sa.sembra reale come ...
... dati autentici.Quindi ripeterà quanto sopra.|Ma / e se il bit di stop non è valido (basso) SAPRÀ che non è sincronizzato e scarterà l'essere e cercherà un bit di inizio valido.si possono prendere decisioni su QUANDO può verificarsi un bit di inizio valido.|Sul successivo bit di inizio apparente si ripete come sopra.Se il risultato è una stringa di dati con 10 sequenze distanziate di 10 bit l'una dall'altra (come nel diagramma) sopra, allora È sincronizzato ei dati SONO convalidati, per quanto si può dire.PU essere spazzatura, ma è spazzatura che assomiglia a dati reali....
|Ogni volta che il sistema fuori sincrono vede uno stop basso (= non valido) ma fa scivolare uno o più bit lungo il forte e SE i dati sono effettivamente validi e privi di errori prima o poi si bloccherà a meno che non ci siano schemi nei datiche corrispondono alla condizione di sincronizzazione 10xxxxxxxx.|Semplici intervalli di alto livello tra i personaggi aiuteranno notevolmente i sistemi a tornare in sincronia.Tutto alto per 9?i tempi dei caratteri garantiranno la sincronizzazione in un sistema privo di errori.
Cinque risposte:
Eugene Sh.
2016-08-09 00:47:03 UTC
view on stackexchange narkive permalink

sta rilevando il bit di inizio. Questo è esattamente lo scopo. La linea inattiva sarà simile a questa:

  ... 1111111111111111111111111111111 ...  

Quando il destinatario vede 0 dopo da molto tempo (o dopo un bit di stop, come vedremo tra poco), sa che la trasmissione è iniziata e inizia a contare bit. Sa che i bit di 8 (o come definito dalla configurazione) dopo il bit di inizio sono dati. Il nono è il bit di stop e dovrebbe essere 1 . In caso contrario, si verifica un errore di frame ed è necessaria la risincronizzazione.

Dopo aver ricevuto il bit di stop, inizia di nuovo ad attendere il bit di avvio. E così via.

Teoricamente potrebbe esserci un problema di sincronizzazione se la linea ha il seguente aspetto:

  ..1010101010101010101 ....  

o simili, quindi in questo caso il ricevitore non vedrà da dove iniziare, ma in questo caso non avrà molta importanza, poiché la posizione di partenza non farà alcuna differenza. Ma per evitare tali problemi alcuni protocolli definiscono la lunghezza di 1,5 (uno e mezzo) bit per il bit di stop per renderlo unico. Oppure, in pratica, ci sono sempre dei ritardi di tempo tra due pacchetti di dati, quindi la linea è inattiva abbastanza a lungo da consentire al ricevitore di sincronizzarsi.

_ "ma in questo caso non avrà molta importanza, poiché la posizione di partenza non farà alcuna differenza" _ - farà la differenza una volta che la linea interromperà la serie di "AA" e inizierà a trasmettere dati diversi.Quindi il ricevitore potrebbe non solo ottenere errori di frame, ma anche dati inutili.
jonk
2016-08-09 05:30:11 UTC
view on stackexchange narkive permalink

Sembra una domanda proveniente da qualcuno che cerca di emulare un ricevitore UART nel software o in un FPGA. Per RS-232, usano il termine marchio e spazio . Ma questi di solito corrispondono, una volta digitalizzati, rispettivamente in un '1' e '0'.

Il ricevitore UART spesso divide ogni bit di tempo (deve essere noto, a priori) in almeno 4, ma spesso 16 o più, sotto-periodi. Si avvia (all'accensione / ripristino) in uno stato in cui ci si aspetta che la linea del ricevitore seriale sia in uno stato mark . Se la linea NON è in un segno in quel momento, allora sa che si trova nel mezzo di un frame di trasmissione e deve aspettare fino a quando può sincronizzarsi. Se la linea è in uno stato mark , allora potrebbe o potrebbe non trovarsi nel mezzo di qualcosa e dovrà aspettare e vedere. Questo è un problema con RS-232, se si collega semplicemente a un altro dispositivo mentre sono in corso le comunicazioni seriali o se fa parte di un tocco per monitorare le comunicazioni seriali asincrone tra due altri lettori e sono appena state ripristinate. Per essere assolutamente sicuri, quando esce comunque dal reset, l'UART dovrebbe osservare almeno N bit time (dove N è il numero di bit per parola, e spesso 7 o 8, e non assumendo alcuna opzione di parità qui) per un valore mark seguito da un bit di tempo di spazio per risincronizzarsi (oppure N + 1 bit di tempo di spazio .) Molti non portano quello stato in giro, in modo che possano sincronizzarsi in modo errato, se avviati nel mezzo di un flusso. Riceverai spesso errori di inquadratura e byte di dati occasionali, fino a quando non si verificherà la risincronizzazione accidentale di nuovo correttamente. Spesso è stato anche un prezzo accettabile. Normalmente, i cavi sono collegati e i dispositivi vengono accesi in un particolare ordine di funzionamento, quindi raramente si verificano problemi.

Una volta sincronizzato, però, l'UART sa cosa aspettarsi.Inizia sempre con la linea del ricevitore che va da un segno a uno spazio , il bit di inizio necessario che dura per un intero bit, seguito da bit di dati e poi seguito da atalmeno un bit di tempo pari a contrassegna (o più) come bit di stop.Se rimane sincronizzato, vedrà quel pattern ripetuto più e più volte.

Parte del motivo per ridurre i tempi di bit, a qualcosa come 4X o 16X, è che i clock utilizzati dal trasmettitoree il ricevitore non sono necessariamente perfettamente accurati e altrimenti sono semplicemente asincroni tra loro.Quindi parte della sincronizzazione che avviene nel ricevitore sta nell'allineare i suoi periodi a cubetti alla temporizzazione del trasmettitore.Più fine è la grana, migliore sarà l'allineamento del ricevitore.

Gregory Kornblum
2016-08-09 00:45:28 UTC
view on stackexchange narkive permalink

UART necessita di silenzio all'inizio per catturare il primo bit di inizio.Quindi conta solo in base al numero predefinito di bit, raggiunge il bit di stop e attende di nuovo il bit di avvio.Se UART inizia a ricevere nel bel mezzo di un lungo messaggio, facilmente potrebbe essere solo spazzatura.

pgvoorhees
2016-08-09 00:46:13 UTC
view on stackexchange narkive permalink

Può dire la differenza perché sa dove dovrebbero essere nel bitstream (perché l'hai detto tu).

Ricorda solo che qualsiasi simbolo non ha significato finché non c'è un significato concordato.

Tony Stewart Sunnyskyguy EE75
2016-08-09 00:51:46 UTC
view on stackexchange narkive permalink

Se inattivo preesiste, non si verificano errori, nessun problema, ma qualsiasi errore come il sovraccarico del buffer richiede un metodo di scuotimento della mano, dopodiché si verifica lo stato di inattività e dovrebbe sincronizzarsi di nuovo dal primo bit di avvio.

L'handshaking è necessario per comunicare il rilevamento di buffer pieno, over run, errore di parità o errore di bit di stop.

Parità dispari è utile qui per rilevare un errore di dati e / o un errore di framing per riprendere l'avvio correttosincronizzazione bit e comunicazione senza errori.



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...