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:

  • Universal → può funzionare con diversi formati di dati, baud rate, bit di stop, parità, ecc.

  • Asynchronous → ogni byte viene inviato con un bit di start e uno (o più) di stop, quindi il ricevitore può sincronizzarsi “al volo” senza bisogno di un clock comune.

  • Receiver/Transmitter → gestisce sia la trasmissione (TX) che la ricezione (RX) dei dati.

È 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 Sincrona

In una comunicazione sincrona, esiste un segnale di clock condiviso tra i dispositivi (master e slave).
Tutti i bit vengono inviati sincronizzati a questo clock, cioè ogni fronte (salita o discesa) indica quando leggere o scrivere un bit.

Esempio:

  • SPI (Serial Peripheral Interface)
  • I²C (Inter-Integrated Circuit)

Caratteristiche principali:

  • Necessita di una linea di clock dedicata (oltre ai dati).
  • Il master genera il clock.
  • La comunicazione è più veloce e precisa perché ogni bit è scandito dal clock.
  • Entrambi i dispositivi devono essere collegati contemporaneamente e seguire il clock.

🔹 Comunicazione Asincrona

In una comunicazione asincrona, non esiste un segnale di clock condiviso.
Ogni dispositivo invia i dati con un proprio ritmo, ma per evitare confusione, i pacchetti di dati includono:

  • 1 bit di start → segnala l’inizio del byte
  • 8 bit di dati
  • (facoltativo) 1 bit di parità per controllo errore
  • 1 o 2 bit di stop → segnala la fine del byte

Esempio classico:

  • UART / Seriale TTL (TX/RX)

Caratteristiche principali:

  • Solo due linee: TX e RX (più la massa GND).
  • Nessun clock condiviso: i due dispositivi devono accordarsi sul baud rate (es. 9600, 115200 bps).
  • Più semplice da cablare, ma meno veloce e precisa rispetto alla sincrona.

Riassumendo

Tipo Clock condiviso Linee principali Esempi Pro Contro
Sincrona ✅ Sì Dati + Clock SPI, I²C Veloce, precisa Più pin, cablaggio complesso
Asincrona ❌ No Solo TX/RX UART Semplice, due fili Meno veloce, necessita baud rate preciso

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 comunicazione

UART (Universal Asynchronous Receiver/Transmitter) indica il protocollo, cioè come i dati vengono trasmessi:

  • in modo seriale (bit uno dopo l’altro)
  • asincrono (senza clock condiviso)
  • con bit di start, dati, stop e (opzionale) parità
  • usa due linee: TX e RX

👉 Quindi UART è la logica, il modo in cui i dati vengono organizzati e inviati.


🔹 TTL → è il livello elettrico

TTL (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:

Standard 1 logico (HIGH) 0 logico (LOW)
TTL (Arduino, ESP32, ecc.) 3.3 V o 5 V 0 V
RS-232 (PC seriale classica) da −12 V a +12 V opposto (logica invertita)

👉 Quindi TTL è il livello fisico del segnale, UART è il metodo di trasmissione.

🔸 Insieme: “UART TTL”

Quando si dice “UART TTL”, si intende:

una comunicazione seriale UART che usa livelli di tensione TTL.

Ecco perché esistono convertitori come:

  • USB ↔ TTL (UART): per collegare il PC (che usa USB o RS232) a un microcontrollore (che usa UART a 3.3 V o 5 V).
  • RS232 ↔ TTL (MAX232): per adattare i livelli elettrici da ±12 V a 5 V o 3.3 V.

🔸 Esempio concreto

  • Il tuo ESP32 o Arduino comunica in UART TTL 3.3 V.
  • Il PC, invece, usa USB (che non è UART).
  • Il convertitore USB-TTL contiene un chip UART (es. CH340, FT232, CP2102) che traduce i dati USB ↔ UART e li porta ai livelli logici giusti (3.3 V o 5 V).

In breve:

  • UART → linguaggio (come parli)
  • TTL → volume del segnale (quanto forte lo dici)

Meccanismo:

🔹 1️⃣ Ogni bit è rappresentato da un livello logico

Esatto: durante la trasmissione, la linea TX resta per un certo tempo a livello alto o basso per rappresentare un 1 o uno 0.

Nel caso di UART TTL:

  • 1 logico = HIGH → 3.3 V (o 5 V)
  • 0 logico = LOW → 0 V

Ma la cosa importante è per quanto tempo rimane alto o basso:
quel tempo è determinato dal baud rate (cioè la velocità di trasmissione).

🔹 2️⃣ Il baud rate definisce la durata di un bit

Il baud rate è la frequenza con cui i bit vengono trasmessi.
Esempio:

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.

🔹 3️⃣ Struttura di un byte nella UART

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)

 

🔹 4️⃣ Come fa il ricevitore a “capire i tempi”

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:

  1. Aspetta mezzo periodo di bit per centrare la misura.
  2. Poi campiona ogni bit successivo a intervalli regolari (es. ogni 104 µs se 9600 baud).
  3. Dopo 8 bit di dati (e opzionalmente uno di parità), si aspetta uno Stop bit HIGH.

In questo modo, anche senza clock condiviso, il ricevitore riesce a “sincronizzarsi” all’inizio di ogni byte grazie allo Start bit.


🔹 5️⃣ Esempio numerico

Supponiamo di inviare il byte 01010101 (0x55) a 9600 baud:

  • Linea a riposo → HIGH (3.3 V)
  • Start bit → LOW (0 V per 104 µs)
  • Poi:
    • 1° bit (LSB=1) → HIGH per 104 µs
    • 2° bit (0) → LOW per 104 µs
    • 3° bit (1) → HIGH per 104 µs
    • … e così via
  • Stop bit → HIGH per 104 µs (o più se la linea rimane inattiva)

Totale circa 10 bit × 104 µs = 1,04 ms per byte.


🔹 6️⃣ In sintesi visiva

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

 

🔹 Significato di LSB → MSB

Quando si trasmette un byte (8 bit), bisogna decidere da quale bit partire:
dal meno significativo o dal più significativo.

  • LSB = Least Significant Bit → il bit meno significativo
  • MSB = Most Significant Bit → il bit 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

🔸 Nella UART

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

🔹 Perché si fa così

È 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

 

Che vuole dire: "Aspetta mezzo periodo di bit per centrare la misura"?

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.

🔹 1️⃣ Il problema: dove leggere il valore del bit?

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?

  • Se legge troppo presto → rischia di beccare ancora la transizione del bit precedente.
  • Se legge troppo tardi → magari è già arrivato il bit dopo.

Serve quindi leggere nel punto più stabile possibile, cioè al centro del periodo del bit.

🔹 2️⃣ Come fa a sapere dove inizia il bit?

La UART non ha clock condiviso, ma sa riconoscere l’inizio dello Start bit perché:

  • la linea è normalmente a riposo (HIGH),
  • appena scende a LOW → è l’inizio di uno Start bit.

Quella transizione HIGH → LOW è il punto di sincronizzazione.

🔹 3️⃣ Cosa fa dopo la transizione

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ì:

  • la prima misura cade al centro dello Start bit (per confermare che è davvero LOW),
  • le successive 8 misure cadono al centro dei bit dati,
    dove il livello è stabile.

🔸 Esempio a 9600 baud (1 bit = 104 µs)

  1. Transizione HIGH→LOW → trovato lo Start bit
  2. Attendo 52 µs (mezzo bit) → ora sono nel centro dello Start bit
  3. Poi campiono ogni 104 µs:
    • dopo 52+104 = 156 µs → 1° bit dati
    • dopo 260 µs → 2° bit dati
    • dopo 364 µs → 3° bit dati
    • … e così via

In questo modo, ogni campione è preso esattamente a metà del tempo di validità del bit, quindi molto stabile.

🔹 4️⃣ Perché non si “sfalsa”

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.

🔸 In breve

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