UART.
Scopo e principio di funzionamento.

Diverse schede Arduino hanno un numero diverso di porte hardware UART, molto spesso una, e l'enorme Mega ne ha quattro. Tuttavia, la semplicità di questa interfaccia consente di emulare la porta utilizzando metodi software, assegnando RX e TX a quasi tutti i pin scelti. Cioè, puoi usare porte su pin rigorosamente definiti (consigliato) o - con alcune restrizioni - "software" e, se necessario, entrambi contemporaneamente.
In generale, la trasmissione si presenta come una catena di segnali, ovvero bit divisi in byte, più (opzionalmente) segnali di servizio.

Mentre le informazioni non vengono trasmesse, nella linea viene mantenuto un livello logico alto (nel nostro caso con Arduino, questo è + 5V, la cosiddetta logica TTL). Il decadimento del segnale è un comando al lato ricevente che sta per iniziare qualcosa di interessante! E dopo un certo lasso di tempo, dipendente da una velocità prefissata, inizia la trasmissione di un byte sotto forma di serie di zeri e uno nel rispetto degli stessi, predeterminati, intervalli di tempo. Dopo l'ottavo bit segue un segnale di stop sotto forma di livello alto e la situazione si ripete fino a quando non vengono trasmessi tutti i byte di cui abbiamo bisogno.
Quando si parla di segnali di servizio, si intendono misure aggiuntive previste dal protocollo per combattere gli errori causati da interferenze nei fili e nei contatti. Sì, il mondo è imperfetto e si verificano interferenze, e più sottili e lunghi sono i fili, più spesso e più forti. Se si aggiunge al protocollo un cosiddetto bit di parità, questo verrà trasmesso nella catena di dati, immediatamente dopo l'ultimo bit del byte di informazione e prima del bit di stop.

La presenza o l'assenza di tale bit è anche specificata nel protocollo in anticipo, insieme alla velocità e ad altri parametri. Qui devi capire che il protocollo ha varietà e può differire per i diversi dispositivi, a seconda delle condizioni e delle preferenze dei programmatori. I parametri principali sono: velocità, numero di bit, parità di bit, lunghezza del segnale di arresto. Ciò implica una condizione importante per il funzionamento della UART: entrambi i dispositivi devono essere configurati allo stesso modo, altrimenti non si capiranno.
Per quanto riguarda Arduino, il più delle volte non viene utilizzato il bit di parità, i dati del byte sono costituiti da otto bit e la lunghezza del segnale di stop è uguale alla lunghezza di un bit.
La velocità di trasferimento viene misurata in "baud", ovvero in bit al secondo. È altamente auspicabile scegliere tra valori standard preformulati:

Maggiore è la velocità, più velocemente i dati scorrono sui cavi, ma maggiore è la probabilità di errori, quindi si raccomanda di non abusare e seguire il principio della ragionevole sufficienza. Per la maggior parte dei casi si consiglia 9600 baud, è abbastanza veloce e molto affidabile anche a distanze decenti, un byte viene trasferito in circa 1ms. Se ciò non bastasse, puoi sempre "accelerare". La massima velocità di trasferimento dati possibile su UART hardware per schede Arduino è 250000 baud, su quelle soft - 115200. Ma, come accennato in precedenza, è meglio non overcloccare a tali valori senza necessità.
I nostri dispositivi possono scambiare dati in entrambe le direzioni, ma nonostante la possibilità teorica del full duplex, in realtà avviene in modo leggermente alternato, sebbene sia abbastanza trasparente all'utente per via del port buffering.
Implementazione in Arduino.


Due stringe di Serial.print() visualizzano in sequenza il testo e valore del timer millis(), la terza stringa di Serial.println() visualizza l'ultima parte di testo e trasferisce la riga . Si scopre una catena infinita di messaggi che possiamo leggere dallo schermo.
Il secondo esempio.
Il terzo esempio.

Conclusione.
UART è senza dubbio e meritatamente l'interfaccia di trasferimento dati più famosa e ampiamente utilizzata. Con il suo aiuto, sensori, attuatori, indicatori e display, moduli GPS e GPRS sono collegati ad Arduino. Attraverso di esso, il programma viene caricato su Arduino e sottoposto a debug. Con esso, puoi organizzare facilmente e rapidamente lo scambio di comandi e informazioni con un altro controller. Tuttavia, presenta anche degli svantaggi, come la limitazione della velocità, l'immunità al rumore relativamente bassa, il requisito della precisione della frequenza di clock sulle schede trasmittenti e riceventi, che è particolarmente critico per i controller alimentati da un generatore RC interno. Tuttavia, rimane uno strumento molto importante con un grande potenziale. Qualsiasi maestro del fai da te, senza eccezioni, dovrebbe conoscere questa interfaccia ed essere in grado di usarla.