Caricamento…
Caricamento…
Articolo tecnico che spiega il funzionamento del protocollo di comunicazione seriale asincrona UART: formato dei dati, baud rate, livelli elettrici ed esempi pratici con Arduino.

UART è l'acronimo di Universal Asynchronous Receiver/Transmitter, cioè trasmettitore/ricevitore asincrono universale. È uno dei modi più semplici e diffusi per far comunicare tra loro due dispositivi elettronici, ad esempio:

La UART è un protocollo seriale asincrono, cioè:
Quindi è importante che entrambi i dispositivi conoscano a quale velocità i dati sono trasmessi/ricevuti.
Una comunicazione UART utilizza normalmente due fili:
Quindi per comunicare:
Non serve altro, tranne una massa comune (GND).
Questo è il tipico collegamento UART tra due dispositivi. In alcuni casi, molto particolari, è possibile che ci siano delle linee aggiuntive per il controllo di flusso dei dati (CTS, RTS), tipiche dello standard RS232.
Quando un dispositivo equipaggiato con UART invia un byte, lo fa bit per bit secondo una struttura precisa chiamata frame.
Un frame UART tipico è composto da:
Start bit → 8 Data bit → (Parity bit) → Stop bit

Sequenza dei bit di una trasmissione UART nel tempo
Vediamo nel dettaglio cosa significano i bit:
Facciamo un esempio: se trasmettiamo sulla UART il byte 0x41 (la lettera "A", ovvero 01000001 in binario), la porta invierà sulla linea:
Livello basso (start) → 1,0,0,0,0,0,1,0 → livello alto (stop)
Il bit meno significativo (LSB) viene trasmesso per primo, mentre l'ultimo è il bit più significativo (MSB).

Sequenza dei bit in un frame di un byte di dati
Perché il bit di START è a livello logico basso? Perché la linea TX, in condizioni di riposo, è sempre a livello logico alto. Quando si avvia la trasmissione con il bit di START, il dispositivo ricevente si predispone a ricevere la sequenza dei bit che compongono l'informazione da trasmettere (in questo caso 8 bit).
Il baud rate è il numero di simboli (bit) trasmessi al secondo. Valori comuni sono:
Come già detto, entrambi i dispositivi devono usare lo stesso baud rate; altrimenti la comunicazione risulterà errata.
Ma UNO o ZERO, che vuol dire in termini elettrici? Vediamo di seguito quali sono le differenze tra le varie applicazioni:
Logica TTL → ad esempio la UART di Arduino, STM32 o microcontrollori in generale:
0 (zero) → 0 volt1 (uno) → 3.3V o 5V (a seconda dei casi)Livelli RS-232 (standard PC) → ad esempio la porta seriale del computer o di dispositivi compatibili con lo standard RS-232.
0 (zero) → +12 volt1 (uno) → -12 voltPosso collegare una porta RS232 standard a un microcontrollore? Sì, ma solo attraverso un convertitore di livelli logici, come ad esempio un MAX232.
Come si può collegare un bus UART di un microcontrollore al PC tramite una porta USB? Ci sono molte soluzioni a tal riguardo; le più comuni sono quelle di utilizzare un convertitore USB-seriale come ad esempio FT232, CP2104 o CH340. Questi dispositivi sono anche disponibili già in board pre-saldate, pronte per essere utilizzate in circuiti breadboard o prototipi.
In una qualsiasi board Arduino UNO o Arduino Nano è già integrata l'interfaccia tra UART e porta USB. Nell'IDE di Arduino è già disponibile l'interfaccia grafica/testo per visualizzare e inviare caratteri da/per la porta UART di Arduino.
Apriamo l'IDE di Arduino, creiamo un nuovo sketch e digitiamo questo semplice codice:
1void setup() {2 Serial.begin(9600); // imposta il baud rate3}45void loop() {6 Serial.println("Ciao da Arduino!");7 delay(1000);8}
Apriamo il monitor seriale dell'IDE e vediamo che Arduino invia, ogni secondo sulla porta UART, la sequenza di caratteri definita in Serial.println, con la velocità di 9600 baud definita nella funzione Serial.begin.

Per fare questo esercizio dovremo utilizzare due schede Arduino UNO (io ho usato due Arduino UNO Rev3).
Le mettiamo in comunicazione tra loro usando la porta UART presente sui pin digitali D0 (RX) e D1 (TX), incrociando le due linee TX/RX tra le due schede. Infine mettiamo in comune le linee GND con un terzo filo (i collegamenti vanno fatti dopo aver caricato gli sketch in entrambe le schede).
Sulla prima scheda, che chiameremo "A", carichiamo questo sketch:
1void setup() {2 Serial.begin(9600);3}45void loop() {6 Serial.println("Messaggio da A");7 delay(1000);8}
Sulla seconda scheda, che chiameremo "B", carichiamo questo sketch:
1void setup() {2 Serial.begin(9600);3}45void loop() {6 if (Serial.available()) {7 String msg = Serial.readStringUntil('\n');8 Serial.print("Ricevuto: ");9 Serial.println(msg);10 }11}
Quindi eseguiamo i collegamenti della porta UART tra le schede:

E apriamo i relativi monitor seriali sull'IDE di Arduino:
Scheda A

Scheda B

In questo esempio vediamo che la Scheda A invia, ogni secondo, la sequenza di caratteri "Messaggio da A", che viene ricevuta dalla Scheda B attraverso la UART. La Scheda B, quando rileva la presenza di caratteri nel buffer seriale (Serial.available), li legge e li riporta sulla porta UART seriale del PC tramite le funzioni Serial.print e Serial.println.
In questo articolo abbiamo visto:
Se sei arrivato alla fine di questa pagina, ci auguriamo che l'argomento sia stato di tuo interesse.
L'obiettivo di questo sito è divulgare tutorial e corsi sulle materie elettronica e programmazione, con la speranza di poter aiutare sempre più persone che desiderano aumentare le proprie conoscenze.
Tutti i tutorial e gli articoli sono scritti con cura e verificati. Per mantenere sempre alto il livello di qualità delle informazioni fornite, puoi aiutarci nei seguenti modi:
Facebook · Instagram · YouTube · X (Twitter)
Grazie per il tuo contributo!