Funzionamento UART
Universal Asynchronous Receiver/Transmitter. In pratica è un circuito (hardware o software) che serve per trasmettere e ricevere dati seriali in modo asincrono, cioè senza un segnale di clock condiviso tra i due dispositivi. Ecco i concetti chiave del nome:
È la base di tutte le comunicazioni seriali TTL che usiamo con Arduino, ESP32, sensori, moduli GPS, Bluetooth, Nextion, ecc. la differenza tra sincrono e asincrono è fondamentale per comprendere bene come funziona una UART rispetto, per esempio, a una SPI o I²C. Ecco una spiegazione chiara e concreta 👇 🔹 Comunicazione SincronaIn una comunicazione sincrona, esiste un segnale di clock condiviso tra i dispositivi (master e slave). Esempio:
Caratteristiche principali:
🔹 Comunicazione AsincronaIn una comunicazione asincrona, non esiste un segnale di clock condiviso.
Esempio classico:
Caratteristiche principali:
Riassumendo
Significato di UART e TTL: Sono due termini che spesso vengono usati insieme — UART e TTL — ma indicano due cose diverse, anche se strettamente collegate. Vediamolo chiaramente 👇 🔹 UART → è il metodo di comunicazioneUART (Universal Asynchronous Receiver/Transmitter) indica il protocollo, cioè come i dati vengono trasmessi:
👉 Quindi UART è la logica, il modo in cui i dati vengono organizzati e inviati. 🔹 TTL → è il livello elettricoTTL (Transistor–Transistor Logic) invece non riguarda il protocollo, ma la tensione elettrica dei segnali. In pratica indica a che livello di tensione corrisponde 0 e 1 logico. Per esempio:
👉 Quindi TTL è il livello fisico del segnale, UART è il metodo di trasmissione. 🔸 Insieme: “UART TTL”Quando si dice “UART TTL”, si intende:
Ecco perché esistono convertitori come:
🔸 Esempio concreto
In breve:
Meccanismo:
|
| Baud rate | Durata di 1 bit |
|---|---|
| 9600 bps | ≈ 104 µs |
| 115200 bps | ≈ 8.68 µs |
👉 Quindi, se trasmetti a 9600 baud, ogni bit rimane stabile per 104 microsecondi.
Un “pacchetto” di byte tipico (frame UART) è così:
Linea a riposo: HIGH
↓
Start bit: LOW (0)8 bit di dati: da LSB a MSB
(Parità: facoltativo)
Stop bit: HIGH (1)
Quando la linea è a riposo (HIGH), il ricevitore è in attesa.
Quando vede una transizione HIGH → LOW,
capisce che è iniziato uno Start bit.
A quel punto:
In questo modo, anche senza clock condiviso, il ricevitore riesce a “sincronizzarsi” all’inizio di ogni byte grazie allo Start bit.
Supponiamo di inviare il byte 01010101 (0x55) a 9600 baud:
Totale circa 10 bit × 104 µs = 1,04 ms per byte.
| Stato | Livello linea | Durata | Significato |
|---|---|---|---|
| Riposo | HIGH | indefinita | Linea inattiva |
| Start bit | LOW | 1 bit time | Inizio byte |
| Bit dati | HIGH/LOW | 1 bit time ciascuno | Valore dei bit (LSB→MSB) |
| Stop bit | HIGH | 1 bit time | Fine byte |
Quando si trasmette un byte (8 bit), bisogna decidere da quale bit partire:
dal meno significativo o dal più significativo.
Un byte è composto così:
MSB LSB
b7 b6 b5 b4 b3 b2 b1 b0
Esempio:
Se il byte è 01010110 (cioè 0x56 in esadecimale)
| Bit | Valore binario | Peso decimale |
|---|---|---|
| b7 | 0 | 128 |
| b6 | 1 | 64 |
| b5 | 0 | 32 |
| b4 | 1 | 16 |
| b3 | 0 | 8 |
| b2 | 1 | 4 |
| b1 | 1 | 2 |
| b0 | 0 | 1 |
La trasmissione avviene partendo dal bit meno significativo (LSB), cioè da b0.
👉 Significa che il primo bit inviato sul filo è b0, poi b1, poi b2 … fino al b7.
Esempio:
Se vuoi trasmettere il carattere “A”, che in ASCII è 01000001,
l’ordine dei bit trasmessi sarà:
1, 0, 0, 0, 0, 0, 1, 0 (cioè al contrario rispetto a come lo scriviamo normalmente).
È una convenzione storica dei primi sistemi seriali (risalente ai teletype e alle linee RS-232).
Si è mantenuta perché semplifica alcuni circuiti logici e garantisce compatibilità con i protocolli già esistenti.
In breve:
| Sigla | Significato | Trasmissione UART |
|---|---|---|
| LSB | Bit meno significativo | Trasmetto per primo |
| MSB | Bit più significativo | Trasmetto per ultimo |
Questa è una delle parti più raffinate del funzionamento della UART.
Vediamo perché quel “mezzo periodo di bit” non sfalsa, ma anzi serve proprio per non sbagliare la lettura.
Immagina che il segnale seriale sia una sequenza di “tacche” (0 e 1) che durano ciascuna un certo tempo (per esempio 104 µs a 9600 baud).
Il ricevitore deve leggere il livello della linea (alto o basso) per ogni bit.
Ma quando esattamente?
Serve quindi leggere nel punto più stabile possibile, cioè al centro del periodo del bit.
La UART non ha clock condiviso, ma sa riconoscere l’inizio dello Start bit perché:
Quella transizione HIGH → LOW è il punto di sincronizzazione.
Appena vede lo Start bit (cioè la linea che scende),
il ricevitore aspetta mezzo periodo di bit per portarsi al centro dello Start bit,
poi comincia a campionare i bit successivi ogni 1 periodo di bit.
Così:
In questo modo, ogni campione è preso esattamente a metà del tempo di validità del bit, quindi molto stabile.
Perché la UART non si sincronizza continuamente, ma solo a ogni byte.
Ogni volta che arriva uno Start bit, la temporizzazione viene “ri-azzerata”.
Quindi eventuali piccoli errori di sincronizzazione non si accumulano nel tempo.
👉 Finito un byte (dopo lo Stop bit), la linea torna a HIGH, e al prossimo Start bit si ricalibra di nuovo.
| Fase | Cosa fa il ricevitore | Perché serve |
|---|---|---|
| Transizione HIGH→LOW | Rileva Start bit | Sincronizza il timer |
| Attende ½ bit | Si porta al centro del bit | Punto stabile |
| Campiona ogni 1 bit | Legge i dati | Tutte le letture centrali e stabili |
| Dopo Stop bit | Aspetta il prossimo Start | Si risincronizza |