Premessa
L'interfaccia seriale RS232 permette lo scambio di dati tra dispositivi
digitali. In questo tutorial si illustreranno principalmente le caratteristiche di
natura elettrica previste dallo standard con l'obiettivo di fornire le poche
informazioni necessarie a progettare dispositivi elettronici che comunicano con
un PC attraverso questa porta.
L'interfaccia seriale RS-232 - Versione 2.0d - Luglio 2001
Copyright © 2001, Vincenzo Villa
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.1 or any later
version published by the Free Software Foundation; with no Invariant Sections,
with no Front-Cover Texts and with no Back-Cover Texts. A copy of the license is
included in the section entitled "
GNU Free Documentation
License".
(E' garantito il permesso di copiare, distribuire e/o modificare
questo documento seguendo i termini della
GNU
Free Documentation License, Versione 1.1 o ogni versione successiva
pubblicata dalla Free Software Foundation)
Il contenuto di questi documenti è fornito "così come è" (AS
IS), a solo titolo didattico e senza garanzia alcuna, implicita o esplicita. In
particolare non ci si ritiene responsabili di alcun danno diretto o indiretto
causato dall'uso di queste informazioni.
Tutti i nomi di ditte e prodotti citati sono proprietà dei legittimi
proprietari.
L'interfaccia RS-232 utilizza un protocollo seriale di tipo asincrono
Seriale significa che i bit che costituiscono l’informazione sono
trasmessi uno alla volta su di un solo "filo". Questo termine è in genere
contrapposto a "parallelo": in questo caso i dati sono trasmessi
contemporaneamente su più fili, per esempio 8, 16 o 32.
Parlando astrattamente si potrebbe pensare che la trasmissione seriale sia
intrinsecamente più lenta di quella parallela (su di un filo possono passare
meno informazioni che su 16). In realtà questo non è vero in assoluto,
soprattutto a causa della difficoltà di controllare lo skew (disallineamento
temporale tra i vari segnali) dei molti trasmettitori in un bus parallelo, e
dipende dalle tecnologie adottate: per esempio in una fibra ottica, in un cavo ethernet,
USB o FireWire (tutti standard seriali) le informazioni transitano ad una
velocità paragonabile a quella di un bus PCI a 32 fili. In questa nota
applicativa si parlerà solo di interfacce seriali "lente" cioè
gestibili da PC e microcontrollori "normali".
Asincrono significa, In questo contesto, che i dati sono
trasmessi senza l’aggiunta di un segnale di clock, cioè di un segnale comune
che permette di sincronizzare la trasmissione con la ricezione; ovviamente sia
il trasmettitore che il ricevitore devono comunque essere dotati di un clock
locale per poter interpretare i dati. La sincronizzazione dei due clock è
necessaria ed è fatta in corrispondenza della prima transizione sulla linea dei
dati.
Le unità di misura
Le unità di misura della velocità di trasmissione sono essenzialmente due:
il baud ed il bit per secondo (bps o, meno spesso, b/s),
spesso trattate erroneamente come sinonimi.
Il baud rate indica il numero di transizioni al secondo che avvengono
sulla linea; il bps indica, come dice il nome, quanti bit al secondo sono
trasmessi lungo la linea.
Nel caso di trasmissione binaria (cioè è presente un livello alto ed uno
basso) le due cose ovviamente coincidono numericamente, da cui la parziale equivalenza
dei due termini. Nel caso di trasmissioni a più livelli, invece, è possibile
trasmettere con una sola transizione più bit: se per esempio posso trasmettere
otto diversi valori di tensione tra 0 ed 7 volt, con un solo valore di tensione
invio tre bit (0V = 000, 1V = 001, 2V = 010…) ed in questo caso una
trasmissione a 1000 baud equivale ad una a 3000 bps.
In questa nota parlerò solo di segnali binari trasmessi secondo lo standard
RS232: quindi il baud rate, pari all'inverso della durata di un bit, coincidente
numericamente con il bps.
Half-duplex e full-duplex
Le due parole sono riferiti a sistemi con un solo ricevitore ed un solo
trasmettitore, come nel caso di un sistema che utilizza la RS232.
Il primo termine indica che la trasmissione è bidirezionale ma non avviene
contemporaneamente nelle due direzioni: un dispositivo (ricevitore, listener o
Rx) ascolta e l’altro (trasmettitore, talkner o Tx) emette segnali. Quando è
necessario si scambiano i ruoli.
La trasmissione full-duplex indica che la trasmissione è bidirezionale e
contemporanea. In questo caso sono necessari ovviamente due fili oppure qualche
altro sistema per distinguere i due messaggi contemporanei nelle due direzioni.
Lo standard RS232 permette una trasmissione full-duplex in quanto è utilizzato un conduttore separato
per ciascun verso di trasmissione delle informazioni. Il vincolo è in genere la
necessità che trasmissione e ricezione abbiano lo stesso formato e, ovviamente,
che ciascuno dei due nodi abbia sufficiente potenza di calcolo per la gestione
del duplice flusso di informazioni.
Se la trasmissione è sempre in un solo verso, si parla di simplex.
Come è fatto un segnale RS-232
La cosa più semplice per descrivere un segnale RS232 è partire con un
esempio.
Nell’immagine che segue è visualizzato, in modo idealizzato, cosa appare
collegando un oscilloscopio ad un filo su cui transita un segnale RS-232 a
9600 bps del tipo 8n2 (più avanti verrà spiegata questa sigla)
rappresentante il valore binario 00110000.

L’ampiezza del segnale è caratterizzata da un valore "alto" pari
a circa +12V ed un valore "basso" pari a –12V. Da notare che, nello
standard RS-232 un segnale alto rappresenta lo zero logico ed uno basso un uno,
come indicato nel disegno e rovesciato rispetto al comune pensare.
A volte un segnale alto (+12V, cioè uno zero logico) è
indicato come space ed uno basso (-12V, uno logico) come mark.
Tutte le transizioni appaiono in corrispondenza di multipli di 104us (pari ad
1/9600 cioè ciascun bit dura esattamente l'inverso del baud rate).
La linea si trova inizialmente nello stato di riposo, bassa (nessun dato in
transito); la prima transizione da basso in alto indica l’inizio della
trasmissione (inizia il "bit di start", lungo esattamente 104us).
Segue il bit meno significativo (LSB), dopo altri 104 uS il secondo bit, e così
via, per otto volte, fino al bit più significativo (MSB). Da notare che il byte
è trasmesso "al contrario", cioè va letto da destra verso sinistra.
Segue infine un periodo di riposo della linea di almeno 208us, cioè due bit di
stop e quindi (eventualmente) inizia un nuovo pacchetto di bit.
Le varianti possibili sono le seguenti:
- Se la trasmissione è più veloce o più lenta, la distanza tra i fronti
varia di conseguenza (p.e. a 1200 bps le transizioni avvengono a multipli di
0,833 ms, pari a 1/1200)
- Invece di trasmettere 8 bit, ne posso trasmettere 6, 7 o anche 9 (ma quest’ultima
possibilità non è prevista dalle porte seriali dei normali PC)
- Alla fine è possibile aggiungere un bit di parità
- Alla fine la linea rimane nello stato di riposo per almeno 1 o 1.5 o 2
bit; notare che, se non ho più nulla da trasmettere, il "riposo" è molto
più lungo, ovviamente. Molti sistemi non possono utilizzano 1.5 bit di stop
In genere il formato del pacchetto trasmesso è indicato da una sigla
composta da numeri e cifre, per esempio 8n1 e 7e2:
- La prima cifra indica quanti bit di dati sono trasmessi (nei due esempi
rispettivamente 8
e 7)
- La prima lettera il tipo di parità (rispettivamente
nessuna ed even-parity, cioè parita pari)
- La seconda cifra il numero di bit di stop (rispettivamente 1 e 2)
Tenendo conto che esiste sempre un solo bit di start, un singolo blocco di
bit è quindi, per i due esempi riportati, costituito rispettivamente da 10
(1+8+0+1) e 11 (1+7+1+2) bit. Da notare che di questi bit solo 8 e,
rispettivamente, 7 sono effettivamente utili.
Lo standard originale prevede una velocità fino a 20Kbps. Uno standard
successivo (RS-562) ha portato il limite a 64Kbps lasciando gli altri parametri
elettrici praticamente invariati e rendendo quindi i due standard compatibili a
bassa velocità. Nei normali PC le cosiddette interfacce seriali RS-232 arrivano
in genere almeno a 115Kbps o anche più: pur essendo formalmente al di fuori di
ogni standard ufficiale non si hanno particolari problemi di interconnessione.
Ovviamente sia trasmettitore che ricevitore devono accordarsi sul modo di
trasmettere i dati prima di iniziare la trasmissione.
E' importante garantire il rigoroso rispetto della durata dei singoli bit:
infatti non è presente alcun segnale di clock comune a trasmettitore e
ricevitore e l'unico elemento di sincronizzazione è dato dal fronte si salita
del bit di start. Come linea guida occorre considerare che il campionamento in
ricezione è effettuato di norma al centro di ciascun bit: l'errore massimo
ammesso è quindi, teoricamente, pari alla durata di mezzo bit (circa il 5% della frequenza di
clock, considerando che anche il decimo bit deve essere correttamente
sincronizzato). Naturalmente questo limite non tiene conto della possibile
difficoltà di riconoscere con precisione il fronte del bit di start
(soprattutto su grandi distanze ed in ambiente rumoroso) e della presenza di
interferenze intersimboliche tra bit adiacenti: per questo spesso si consiglia
caldamente di usare un clock con una precisione migliore dell'1% imponendo di
fatto l'uso di oscillatori a quarzo. Si potrebbe anche ipotizzare un meccanismo
che tenta di estrarre il clock dai fronti intermedi ma si tratta nel caso
specifico di un lavoro poco utile, visto che la lunghezza del pacchetto è
piuttosto breve.
Oltre ai bit dei dati (in numero variabile tra 5 ed 9) viene inserito un bit
di parità (opzionale) per verificare la correttezza del dato ricevuto. Esistono
cinque tipi di parità:
- None: nessun tipo di parità, cioè nessun bit aggiunto
- Pari (even): il numero di mark (incluso il bit di parità) è sempre pari
- Dispari (odd): il numero di mark (incluso il bit di parità) è sempre
dispari
- Mark: il bit di parità vale sempre mark
- Space: il bit di parità vale sempre space
La tensione di uscita ad un trasmettitore RS232 deve essere compresa in
valore assoluto tra 5V e 25V (quest'ultimo valore ridotto a 13V in alcune
revisioni dello standard). A volte le tensioni in uscita sono intenzionalmente
diminuite a +/- 6V anziché 12V per permettere minori emissioni EMC, peraltro
sempre critiche, e favorire maggiori velocità di trasmissione.
Il ricevitore deve funzionare correttamente con tensioni di ingresso
comprese, sempre in modulo, tra i 3V ed i 25V. Molti ricevitori commerciali
considerano semplicemente una tensione di soglia al valore di +2V (sopra viene
riconosciuto un segnale alto, sotto uno basso) anche se ciò non è pienamente
aderente alla norme. E' però utile per effettuare una trasmissione
"rs232" con livelli TTL...
L’impedenza di uscita del trasmettitore deve in ogni situazione essere maggiore di 300 ohm;
l’impedenza di ingresso deve essere compresa tra
i 3 ed i 7 kohm, anche a dispositivo spento. La corrente prelevabile in uscita mantenendo i corretti valori
logici deve essere di almeno di 1.6 mA (potrebbe però essere maggiore, anche di
un
ordine di grandezza) e nel caso di corto circuito deve essere minore di 100mA.
Infine lo slew-rate (cioè la pendenza del grafico del segnale nel passare da
1 a 0 o viceversa) deve essere minore di 30V/us per evitare eccessive emissioni
elettromagnetiche.
Come collegare una porte TTL o CMOS alla RS232
In genere i segnali utilizzati dai sistemi digitali variano tra 0 e 5V e non
sono quindi direttamente compatibili con la standard RS232. In commercio
esistono appositi traslatori di livello che hanno il compito di fornire
sia in trasmissione che in ricezione gli opportuni livelli pur non modificando
la forma del segnale trasmesso.
Alcuni integrati (per esempio i classici 1488 e 1489, rispettivamente un
trasmettitore ed un ricevitore, ambedue a quattro canali) sono molto usati in
sistemi in cui è presente (oltre all'alimentazione logica di 5V o 3.3V )
un'alimentazione duale a +/-12V. Questo integrato, come praticamente tutti i
circuiti di questo tipo, contiene un inverter per ciascun canale e quindi
nel segnale in uscita o in ingresso uno zero logico appare come 0 volt,
cioè in quella che a molti sembra essere la rappresentazione ovvia dei segnali
digitali.
L'uso di questi integrati è semplice ma non è sempre attuabile a causa
della necessità di disporre di tre alimentazioni: si pensi per esempio alle
apparecchiature alimentate a batteria.
Il MAX232 (ed integrati simili, fatti da un po' tutti i produttori di
semiconduttori) è un circuito integrato che permette il collegamento tra logica
TTL o CMOS a 5V e le tensioni RS-232, partendo solo da un'alimentazione a 5V.
Per ottenere la tensione positiva e negative necessarie per il funzionamento
dell'integrato è usata una configurazione a pompa di carica,
costituito da circuiti interni all'integrato e quattro condensatori esterni di
circa 1 uF. La capacità effettiva dipende dal tipo di integrato e dalla
relativa frequenza di commutazione; a volte i condensatori sono presenti
all'interno dell'integrato stesso.
Sono disponibili anche integrati che richiedono un'alimentazione di solo 3.3V
(p.e. il MAX3232).
La sezione ricevente del MAX232 è costituita da due porte invertenti che
accettano in ingresso una tensione di +/- 12V (o altra tensione compatibile allo
standard RS232) ed in uscita hanno un segnale TTL compatibile.
La sezione trasmittente ha due driver invertenti con in ingresso TTL compatibile
e capaci di erogare a vuoto una tensione di poco meno di +/- 10V,
compatibile con lo standard RS232.
Un circuito a pompa di carica
Per ricavare le tensioni positive e negative necessarie per garantire i
livelli richiesti dalla RS232 è pratica comune utilizzare un duplicatore ed un
invertitore di tensione a pompa di carica.

Le figure A e B mostrano come viene ottenuto il raddoppio della tensione. Una
immagine che rende l'idea è quella di un contenitore (C2) che preleva acqua da
una fonte e la riversa in un secondo contenitore (C1) posto a maggiore altezza.
Più in dettaglio:
- Inizialmente il condensatore C2 viene connesso tra massa e Vcc; quindi la
corrente (in blu) carica C2 alla tensione di alimentazione (in giallo).
Quindi Vc2 = Vcc
- C2 viene successivamente connesso tra Vcc ed un secondo condensatore C1; la tensione ai capi di C1 deve essere uguale alla somma di Vcc
e Vc2 e quindi C2
si scarica verso C1, che aumenta la propria tensione rispetto a massa
- Il processo è ripetuto fino a quando la tensione ai capi di C1 è uguale
a 2Vcc: in questo caso infatti C2 non si può più scaricare.
Da notare che, nel funzionamento normale, il processo non può mai
interrompersi in quanto il carico collegato a C1, non disegnato, assorbe
corrente e quindi tende a scaricare C2 stesso.
Analogamente le figure C e D mostra l'inversione di tensione:
- Inizialmente C2 è caricato alla tensione di alimentazione (magari, come
nel disegno da 2Vcc, ricavata con il precedente circuito)
- Quindi C2 è connesso tra massa e C1 avendo cura di invertire le
polarità. In questo modo C1 si carica a -2Vcc
Il limite dei circuiti a pompa di carica è la limitata quantità di corrente
disponibile: infatti se prelevo corrente da C1 questo tende a scaricarsi,
facendo scendere la tensione; la corrente generata da un circuito integrato tipo
Max232 è generalmente tutta utilizzata per il solo funzionamento del driver e
quindi non è disponibile per altri circuiti.
La piedinatura del connettore RS-232 del PC
Sono disponibili sul PC due tipi di connettori RS-232: DB9 (nove pin) e DB25
(25 pin, il connettore originale e presente solo sui PC più vecchi); ambedue i
connettori sono maschi e praticamente identici dal punto di vista funzionale
anche se non coincidente con quello proposto dallo standard ufficiale.

Nell'immagine sono visualizzati in basso i due tipi di connettori utilizzati
sui PC di vecchia generazione; in quelli più recenti sono utilizzati solo
connettori DB9, quando ci sono. Quello in alto è relativo alla porta parallela.
Di seguito la tabella con indicati i nomi dei segnali, il numero dei pin e la
direzione del segnale (O = uscita dal PC).
|
Sigla |
25pin |
9pin |
In/Out |
Nome |
|
TxD |
2 |
3 |
O |
Dati trasmessi |
|
RxD |
3 |
2 |
I |
Dati ricevuti |
|
RTS |
4 |
7 |
O |
Request To Send |
|
CTS |
5 |
8 |
I |
Clear To Send |
|
DTR |
20 |
4 |
O |
Data Terminal Ready |
|
DSR |
6 |
6 |
I |
Data Set Ready |
|
RI |
22 |
9 |
I |
Ring Indicator |
|
DCD |
8 |
1 |
I |
Data Carrier Detect |
|
GND |
7 |
5 |
- |
Massa |
|
- |
- |
1 |
- |
Terra |
Non ho riportato un disegno dello schema per un semplice motivo: in genere
crea solo problemi interpretativi in particolare se non è specificato se si
tratta del connettore maschio o di quello femmina e se la vista è dal lato
connettore o dal lato dei pin. Molto meglio leggere i numeri sempre riportati
sul connettore plastico.
Una nota: quello usato dal PC non è il connettore previsto ufficialmente
dallo standard che assegna una funzione a tutti e 25 i pin del connettore DB25.
Perché tanti fili ?
In teoria per ricevere e trasmettere un segnale RS-232 bastano tre fili:
ricezione, trasmissione e massa. Spesso lo è anche in pratica.
Gli altri fili (spesso opzionali, ma dipende dall’applicazione) servono per
il cosiddetto handshake tra PC e periferica (o tra PC e PC) cioè per
sincronizzare in hardware la comunicazione.
Sono presenti due coppie di fili:
- RTS/CTS: quando il PC inizia la trasmissione pone RTS alto, la periferica
risponde quando pronta ponendo CTS alto. Per interrompere la trasmissione la
periferica pone CTS basso.
- DTR/DSR: Quando il PC è collegato per la prima volta, pone alto DTR. La
periferica risponde ponendo alto DSR
Purtroppo questo modo di procedere ha un’infinità di variazioni. La
parola d’ordine è: arrangiarsi per tentativi.
Un uso alternativo dei pin RTS e DTR è l'utilizzo come fonte di
alimentazione del dispositivo collegato alla porta seriale stessa. L'esempio
classico è il mouse seriale ma nulla impedisce di collegare un microcontrollore
generico o qualche altro circuito. Unico ed importante limite è la corrente
erogata, visto che questi pin non sono pensati per questo uso: è opportuno
limitarsi ad un paio di mA anche se molti PC (ma non i portatili) permettono di
arrivare tranquillamente a 10mA o anche più. Attenzione che è una sorgente non
regolata.
Gli UART integrati che permettono di trasformate il segnale parallelo
proveniente dal processore in segnale seriale. In genere vengono gestite
dall'hardware tutte le funzioni a basso livello necessarie (inserimento dei bit
di start e di stop, generazione o riconoscimento del bit di parità, generazione
di interrupt) e spesso è presente un buffer FIFO che permette di ricevere ed
inviare dati anche quando la CPU è impegnata. La descrizione di una UART va
oltre gli scopi di questo tutorial: vi rimando quindi ad altre
risorse disponibili in rete.
A volte, usando microcontrollori, questa funzione viene svolta in software
anche se spesso in questo modo non si superano i 9600bps.
Risorse in rete
Un tutorial sulla RS232 veramente completo e ben fatto è quello di Craig
Peacock disponibile sul sito http://www.beyondlogic.org,
dove viene affrontato in particolare l'uso della UART del personal computer.
Relativamente all'uso della seriale in ambiente DOS, posso segnalare anche la
libreria C uart_lib di Chris Blum (purtroppo non
riesco a trovare riferimenti aggiornati in rete).
Sul http://www.vincenzov.net ho inserito alcuni tutorial su altre
interfacce seriali e parallele e in diversi progetti
ho utilizzato routine di trasmissione e ricezione seriale per i microcontrollori
ST6.
I siti dei produttori di componenti elettronici presentano i fogli tecnici
con tutte le informazioni relative ai loro prodotti per l'interfaccia RS232: a
solo titolo di esempio cito http://www.ti.com,
http://www.maxim-ic.com e http://www.national.com.
GNU Free Documentation License
La licenza GNU FDL, disponibile sul sito http://www.gnu.org
anche in versione
italiana, è parte integrante di questo documento e ne contiene i termini di
utilizzo.
Questo tutorial è liberamente disponibile sul sito http://www.vincenzov.net.