
UART: frame, baud rate e livelli elettrici
Comprendi la trasmissione UART asincrona: bit di start e stop, ordine dei dati, parità, baud rate, tolleranza del clock, errori e compatibilità con TTL, CMOS, RS-232 e RS-485.
Redazione e revisione tecnica:Team di ingegneria ElectroDesignForge
Consulta il processo editorialePunto chiave: UART trasmette i bit senza un clock condiviso. Il ricevitore si risincronizza su ogni bit di start, poi campiona i dati a intervalli calcolati. Le due estremità devono avere lo stesso formato di trama, temporizzazioni baud sufficientemente vicine e livelli elettrici realmente compatibili.
UART definisce una trama, non un'interfaccia elettrica
UART (Universal Asynchronous Receiver/Transmitter) converte un byte in bit su TX e ricostruisce i byte ricevuti su RX. È asincrona: a differenza di SPI, non ha un filo di clock.
| Livello | Cosa definisce | Esempi |
|---|---|---|
| Trama UART | riposo, start, dati, parità, stop, ordine dei bit, velocità | 8N1 a 115200 baud |
| Collegamento elettrico | tensione, polarità, riferimento, corrente, cavo | CMOS a 3.3 V, logica a 5 V, RS-232, RS-485 |
Due schede possono entrambe “usare UART” senza potersi collegare direttamente: un GPIO a 3.3 V non è un'uscita RS-232. Nella convenzione logica più comune, la linea a riposo è alta (mark), una trama inizia con un livello basso e termina con un livello alto.
Struttura della trama
La notazione usuale è bit dati + parità + bit di stop. 8N1 indica otto bit dati, nessuna parità e un bit di stop.
Riposo Start D0 D1 D2 D3 D4 D5 D6 D7 Parità Stop Riposo
1 | 0 | b0 b1 b2 b3 b4 b5 b6 b7 | P | 1 | 1
<----------- durata di un bit Tb = 1 / baud ----------->
Start, dati, parità e stop
Il bit di start rimane basso per la durata di un bit. Dopo un fronte di discesa, il ricevitore attende all'incirca mezzo bit per convalidarlo, poi campiona vicino al centro di ogni intervallo. Le UART moderne spesso sovracampionano a ×8 o ×16; consulta il manuale della periferica per la convalida e la tolleranza esatte.
I dati vengono normalmente trasmessi a partire dal bit meno significativo (LSB). Il valore esadecimale 0x53, scritto convenzionalmente 0101 0011, viene trasmesso come 1 1 0 0 1 0 1 0 da D0 a D7. È un errore facile da commettere leggendo un oscilloscopio. L'hardware può offrire da 5 a 9 bit dati; le due estremità devono usare la stessa configurazione.
| Impostazione della parità | Regola per dati più parità | Limite |
|---|---|---|
N | nessun bit aggiuntivo | nessun rilevamento degli errori |
E | il numero totale di 1 è pari | non rileva un numero pari di bit alterati |
O | il numero totale di 1 è dispari | stessa capacità di rilevamento, convenzione opposta |
| mark / space | 1 forzato / 0 forzato | modalità hardware poco comuni |
La parità rileva alcune alterazioni ma non può localizzarle né correggerle. L'integrità dei messaggi richiede un CRC o checksum, un numero di sequenza e una procedura di ritrasmissione a un livello superiore. I bit di stop sono alti; un livello basso quando è atteso un bit di stop provoca normalmente un errore di trama.
Velocità in baud ed errore di clock
Il baud misura i simboli al secondo. Una UART binaria trasporta normalmente un bit per simbolo, quindi 9600 baud equivalgono in genere a 9600 bit/s. La durata di un bit è Tb = 1 / baud.
| Velocità | Tb | Durata della trama 8N1 |
|---|---|---|
| 9,600 baud | 104.17 µs | 1.042 ms |
| 57,600 baud | 17.36 µs | 173.6 µs |
| 115,200 baud | 8.681 µs | 86.81 µs |
| 1,000,000 baud | 1.000 µs | 10.00 µs |
Una trama 8N1 richiede dieci intervalli di bit. La portata utile massima è quindi baud × 8 / 10: un flusso continuo a 115200 baud trasporta al massimo 11,520 byte/s prima dell'overhead del protocollo.
Trasmettitore e ricevitore hanno clock indipendenti. Lo scostamento dell'istante di campionamento si accumula nel corso della trama: errore temporale accumulato ≈ numero di intervalli di bit × errore relativo totale di frequenza. Mantienilo ben sotto metà della durata di un bit, lasciando margine per jitter, quantizzazione del divisore, rumore e fronti lenti. Un obiettivo progettuale comune è un errore relativo combinato inferiore a circa 2%, ma non è un limite universale: la tolleranza reale dipende da lunghezza della trama, sovracampionamento e struttura del ricevitore. Due oscillatori da ±1% possono differire del 2% nel caso peggiore. Verifica anche l'errore del divisore baud: un clock di sistema non genera sempre esattamente 115200 baud.
CMOS, TTL, RS-232 e RS-485
“TTL” e “CMOS” sono abbreviazioni: usa sempre le soglie d'ingresso e i limiti massimi assoluti del dispositivo effettivo.
| Interfaccia | UART a riposo | Tensioni tipiche | Collegamento diretto a UART da 3.3 V? |
|---|---|---|---|
| CMOS da 3.3 V | alta | vicino a 0 / 3.3 V | sì, se le soglie sono compatibili |
| Logica da 5 V | alta | vicino a 0 / 5 V | solo con ingresso tollerante a 5 V |
| RS-232 | negativa (mark) | spesso da −5 a −12 V / da +5 a +12 V | no, serve un transceiver RS-232 |
| RS-485 | differenziale | coppia A/B | no, serve un transceiver RS-485 |
Per un collegamento logico corto, collega TX_A a RX_B, TX_B a RX_A e condividi un riferimento di massa. Un'uscita a 5 V può danneggiare un ingresso a 3.3 V non tollerante, anche se inizialmente il collegamento sembra funzionare.
RS-232 usa ampiezze diverse e polarità invertita: il livello logico 1 a riposo è normalmente negativo, mentre il bit di start 0 è positivo. Un transceiver del tipo MAX232 gestisce conversione di tensione e inversione. RS-485 è un livello fisico differenziale, non una “UART più potente”: la UART pilota DI e legge RO, mentre il transceiver pilota A/B. Il progetto deve includere controllo di abilitazione (DE), terminazione, polarizzazione, topologia del cavo e gestione delle collisioni half-duplex.
Errori e messa in servizio
| Segnalazione | Significato usuale | Cause comuni |
|---|---|---|
| Errore di parità | la parità ricevuta non corrisponde | rumore, impostazione errata, temporizzazione al limite |
| Errore di trama | bit di stop non valido | velocità errata, inversione, condizione di break |
| Overrun | arriva un nuovo byte prima che il precedente sia gestito | interrupt bloccato, DMA assente, buffer piccolo |
| Break | linea bassa più a lungo di una trama | break intenzionale, cortocircuito, dispositivo fermo |
- Annota la configurazione completa: per esempio
115200, 8N1, LSB per primo, senza controllo di flusso, CMOS da 3.3 V. - Verifica
TX ↔ RX, massa comune, alimentazione del transceiver eDE. - Misura un intervallo di bit: a 115200 baud è circa 8.68 µs.
- Trasmetti
0x55, poi0x00e0xFFcome sequenze diagnostiche. - Conta le segnalazioni di parità, trama e overrun: il solo testo corrotto non identifica la causa.
Errori comuni
- Scambiare 115200 baud per 115200 byte/s:
8N1arriva al massimo a 11,520 byte/s. - Incrociare TX/RX due volte o dimenticare la massa comune in un collegamento CMOS.
- Collegare RS-232 direttamente a un GPIO.
- Usare la parità come protezione del messaggio invece di un CRC.
- Attribuire ogni errore alla velocità in baud: buffer pieno, tensioni incompatibili, massa rumorosa o contesa RS-485 possono dare sintomi simili.