RS-232
Da Wikipedia, l'enciclopedia libera.
L'interfaccia seriale RS232 permette lo scambio di dati tra dispositivi digitali. Ovvero, in termini più pratici, è uno di quegli ingressi, ad esempio dei PC, che consentono di stendere un cavo fisico tra due apparecchiature elettroniche in modo che le stesse riescano a comunicare tra di loro. Pur essendo ancora presente nella maggioranza dei moderni pc la porta seriale è stata completamente soppiantata dall'interfaccia USB.
Indice |
[modifica] Storia dello standard
L'interfaccia seriale RS232 è uno standard costituito da una serie di protocolli meccanici, elettrici ed informatici che rendono possibile lo scambio di informazioni a bassa velocità tra dispositivi digitali.
Lo standard RS232 nacque nei primi anni '60 per opera della "Electronic Industries Association" ed era orientato alla comunicazione tra i mainframe e i terminali attraverso la linea telefonica, utilizzando un modem. Esso includeva le caratteristiche elettriche dei segnali, la struttura e temporizzazioni dei dati seriali, la definizione dei segnali e dei protocolli per il controllo del flusso di dati seriali su un canale telefonico, il connettore e la disposizione dei suoi pin ed infine il tipo e la lunghezza massima dei possibili cavi di collegamento.
Nel corso di questi oltre 40 anni lo standard si è evoluto pur mantenendosi in larga parte invariato. L'evoluzione è riconoscibile dalla sigla, leggendo l'ultima lettera; l'ultima revisione è del 1997 ed è indicata come RS232f. Probabilmente la versione più diffusa è la RS232c, del 1969, corrisponde alle specifiche europee CCITT raccomandazione V.24 Pur essendo un protocollo piuttosto vecchio, attualmente la RS232 è ancora largamente utilizzata per la comunicazione a bassa velocità tra microcontrollori, dispositivi industriali ed altri circuiti relativamente semplici che non necessitano di particolare velocità; è invece praticamente scomparsa in ambito "desktop", ambito nel quale lo standard è nato per la comunicazione tra un computer ed un modem.
Le informazioni raccolte in questo tutorial, relative principalmente al livello elettrico, sono state codificate inizialmente dallo standard EIA/TIA-232-E (sezione 2) e successivamente modificate in alcuni dettagli secondari dallo standard EIA/TIA-562.
[modifica] Caratteristiche elettriche
Le caratteristiche di natura elettrica previste dallo standard consentono di acquisire le poche informazioni necessarie a progettare dispositivi elettronici che comunicano con un PC attraverso questa porta. I segnali che vengono supportati dal dispositivo sono di tre tipi:
- MARK: Compresi tra -3v e -15v;
- SPACE: Compresi tra +3v e +15v;
- INCERTEZZA: Compresi tra -3v e +3v;
Questi tipi di segnali hanno la stessa logica per quasi tutti i circuiti del dispositivo (circuiti A e B) ma posso avere logica inversa per alcuni tipi di circuito (circuiti C e D).
[modifica] Definizione
L'interfaccia RS-232 ridotta (ovvero solo asincrona) utilizza un protocollo di trasmissione 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 voce 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.
[modifica] 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 (0 V = 000, 1 V = 001, 2 V = 010…) ed in questo caso una trasmissione a 1000 baud equivale ad una a 3000 bps.
Nel caso dello standard RS232 i livelli utilizzati sono due quindi il baud rate coincide numericamente con il bps.
[modifica] Half-duplex e full-duplex
Le due parole sono riferite a sistemi con un solo ricevitore ed un solo trasmettitore, come nel caso di un sistema che utilizza la RS232.
Half-duplex 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.
[modifica] 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 +12 V ed un valore "basso" pari a –12 V. 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 (+12 V, cioè uno zero logico) è indicato come space ed uno basso (-12 V, 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, alta (nessun dato in transito); la prima transizione da alto a basso 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 5, 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, 1.5 o 2 bit; notare che, se non ho più nulla da trasmettere, il "riposo" è molto più lungo, ovviamente. Molti sistemi non possono utilizzare 1.5 bit di stop che venivano usati dalle telescriventi a 110 baud di velocità perché permetteva il CR/LF (ritorno carrello/salto linea). In genere, nei personal computer, il formato del pacchetto ricetrasmesso è 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à da 75baud a 19200baud. 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.
È 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 di discesa 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.
[modifica] Il bit di parità
Oltre ai bit dei dati (in numero variabile tra 5 e 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;
[modifica] I parametri elettrici RS-232
La tensione di uscita ad un trasmettitore RS232 deve essere compresa in valore assoluto tra 5 V e 25 V (quest'ultimo valore ridotto a 13 V in alcune revisioni dello standard). A volte le tensioni in uscita sono intenzionalmente diminuite a +/- 6 V anziché 12 V per permettere minori emissioni EM, peraltro sempre critiche, e favorire maggiori velocità di trasmissione.
Il ricevitore deve funzionare correttamente con tensioni di ingresso comprese, sempre in modulo, tra i 3 V ed i 25 V. Molti ricevitori commerciali considerano semplicemente una tensione di soglia al valore di +2 V (sopra viene riconosciuto un segnale alto, sotto uno basso) anche se ciò non è pienamente aderente alla norme. È 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 100 mA.
Infine lo slew-rate (cioè la pendenza del grafico del segnale nel passare da 1 a 0 o viceversa) deve essere minore di 30 V/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 5 V 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 MC1488 e MC1489, introdotti sul mercato dalla Motorola, rispettivamente un trasmettitore ed un ricevitore, ambedue a quattro canali) sono molto usati in sistemi in cui è presente (oltre all'alimentazione logica di 5 V o 3.3 V) un'alimentazione duale a +/-12 V. 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, fu introdotto dalla Maxim ma furono e sono prodotti da molte ditte di semiconduttori) è un circuito integrato che permette il collegamento tra logica TTL o CMOS a 5 V e le tensioni RS-232, partendo solo da un'alimentazione a 5 V.
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 (i valori iniziali erano da 10uF per arrivare ai 100nF). 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.3 V (p.e. il MAX3232).
La sezione ricevente del MAX232 è costituita da due porte invertenti che accettano in ingresso una tensione di +/- 12 V (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 +/- 10 V, 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.
[modifica] La piedinatura del connettore RS-232 del PC
Sono disponibili sul PC due tipi di connettori RS-232: DE9 (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 (Inversione dei connettori maschio / femmina che nello standard sono femmina).
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 DE9, 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 quasi tutti e 25 i pin del connettore DB25.
Perché tanti fili? L'interfaccia EIA RS232 è nata con l'unico scopo di connettersi ad un Modem e quindi ha tutti i controlli per gestire questa apparecchiatura. Tuttavia l'interfaccia viene spesso usata per connettere direttamente fra di loro due PC e, in teoria per ricevere e trasmettere un segnale in modo asincrono bastano tre fili: ricezione, trasmissione e massa. Spesso, se si usa un programma di connessione che non controlla gli altri segnali d'interfaccia, lo è anche in pratica.
Gli altri segnali (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 segnali: DTR/DSR: Quando la porta RS232 è attivata per la prima volta dal programma, pone alto DTR. La periferica risponde ponendo alto DSR
RTS/CTS: quando il PC vuole iniziare la trasmissione pone RTS alto, la periferica risponde quando pronta ponendo CTS alto. Per interrompere la trasmissione la periferica pone CTS basso.
La corretta configurazione di un cavo incrociato null modem (che fa quindi la funzione dei due Modem che dovrebbero interporsi fra i due PC) è la seguente:
Connerrore A --- Connettore B
TX ------------------------> RX
RX <------------------------ TX
SG <---------------------> SG
DTR--->DSR DTR--->DSR
RTS--->CTS------------>DCD
DCD<------------CTS<---RTS
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 una decina di mA . Attenzione che è una sorgente non regolata e non protetta.
Uart Gli UART (Universal Asincronus Receiver & Trasmitter) sono dei circuiti 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 9600 bps.