Lo standard RS-3232-C definisce i parametri per la connessione di un dispositivo terminale DTE (Data Terminal Equipment) e un dispositivo di comunicazione DCE (Data Comunication Equipment), con uno scambio seriale asincrono di dati
binari (oppure tra due DTE con colloquio Null Modem).
-
Il canale è formato da un conduttore elettrico a più poli, su cui è pilotata una differenza di potenziale tra -25v e +25v.
-
Il trasmettitore genera una d.d.p. di circa +15v per lo zero e per l'ON, mentre genera una d.d.p. di circa -15v per l'uno e per l'OFF.
-
Il ricevitore interpreta tutto il campo tra -25v e -3v come un uno (OFF) e tutto il campo tra +3v e +25v come uno zero (ON); il campo tra -3v e +3v è una zona di transizione tra i due livelli (che non può essere istantanea): eventuali letture in questo campo sono considerate errore.
-
La velocità di trasmissione va da 2 a 115200 baud (in questo caso equivalenti a bit per secondo).
-
Il codice utilizzato può avere 5, 6, 7 o 8 bit per carattere; il controllo di parità (pari o dispari) può essere aggiunto solo per i codici a 5, 6 o 7 bit.
-
Sono possibili una serie di opzioni per l'handshaking legate all'uso o meno di alcuni di segnali di controllo accessori; la connessione può richiedere quindi da 2 a 9 fili.
|
Segnale |
Utilizzo |
Connettore
25 pin |
Connettore
9 pin |
|
GND1 |
Collegamento tra i telai delle apparecchiature connesse |
1 |
5 |
|
TX |
Trasmissione dei dati |
2 |
3 |
|
RX |
Ricezione dei dati |
3 |
2 |
|
RTS |
Request to Send: abilita il trasferimento dei dati |
4 |
7 |
|
CTS |
Clear to Send: riceve l’abilitazione al trasferimento |
5 |
8 |
|
DSR |
Data Set Ready: verifica la presenza del segnale DTR |
6 |
6 |
|
GND2 |
Neutro di riferimento |
7 |
5 |
|
CD |
Carrier Detect: verifica la presenza della portante sul modem |
8 |
1 |
|
DTR |
Data Terminal Ready: indica la possibilità di ricevere o trasmettere dati |
20 |
4 |
Per la connessione dei dispositivi al canale sono usati dei connettori a vaschetta (maschio e femmina) a 9 o a 25 pin.

Per un collegamento elementare tra due PC è sufficiente utilizzare un cavetto a 4 poli, collegando i segnali di massa tra loro e incrociando i collegamenti tra Tx e Rx: in tal caso il controllo di flusso del colloquio (handshaking) è affidata ad un protocollo esclusivamente di tipo software: ad esempio nella tecnica XON-XOFF sui canali dati (Tx e Rx) vengono inoltrati codici speciali (17h e 19h) per autorizzazione a procedere e/o per richiesta di pausa; ovviamente questi codici non devono far parte del messaggio trasmesso (non a caso nel codice ASCII i primi 32 caratteri sono riservati ai controlli).

È possibile costruire un protocollo più complesso (ad esempio READY-BUSY) come quello richiesto dal collegamento con il modem, incrociando tra loro i segnali RTS-CTS e DSR-DTR.

Il circuito di interfaccia UART - RS232
La comunicazione seriale nei PC è affidata ad un dispositivo detto UART (Universal Asynchronous Receiver Transmitter) in grado di gestire una linea bidirezionale Asincrona, secondo lo standard RS232, provvedendo autonomamente alla gestione dei bit di Start, di Stop e di parità orizzontale, e degli errori di overrun.
Il microprocessore è collegato al dispositivo attraverso il bus dati, il bus indirizzi e i segnali di
controllo; l'accesso ai registri, ciascuno con un proprio indirizzo, è attivato in modalità Isolated I/O:
-
i registri di Controllo determinano le modalità di funzionamento dell'interfaccia, e devono essere programmati dal microprocessore in base ai parametri del protocollo concordati con gli altri dispositivi: occorre fissare la velocità di trasmissione, il controllo di parità (Parità Pari, Parità Dispari, Nessuna Parità), la lunghezza del carattere (da 5 a 8 bit);
-
i registri di Stato (Flags) indicano il valore dei segnali di controllo ricevuti, l'avvenuta trasmissione e/o ricezione dei dati, le eventuali condizioni d'errore;
-
la sezione Trasmissione, contiene il registro a scorrimento per la serializzazione del dato e il buffer temporaneo Tx
Hold;
-
la sezione Ricezione, contiene il registro a scorrimento campionatore e il buffer temporaneo Rx Hold. Trasmissione e Ricezione possono operare in contemporanea consentendo la gestione di una linea full
duplex;
-
il generatore di clock, sulla base di un clock base fornito esternamente, provvede a generare la frequenza di trasmissione e di ricezione dei bit (Baud Rate), nonché quella di campionamento, multipla 16X o
32X.

Ogni carattere ricevuto sul Bus Dati viene inserito sul Registro Hold di trasmissione: se questo è già pieno, verrà attivata la Flag di errore di Overrun; resta a carico del programma gestore il controllo della disponibilità del registro.
L'UART provvede appena possibile a trasferire il dato dall'Hold-Tx allo Shift-Tx, ed a trasmettere il dato sulla
linea Tx; in caso di ritardo, da parte della CPU, nella scrittura di un nuovo carattere I'UART si limita a mantenere la linea al livello "1" (stato di wait).
I dati ricevuti sulla linea Rx vengono inseriti sullo Shift-Rx e da questo sull'Hold-Rx; se la CPU non ha prelevato il carattere precedente, verrà attivata la Flag di errore di Overrun: restano a carico della CPU la verifica dell'errore e le conseguenti operazioni di recovery, in funzione del protocollo utilizzato.
Il dispositivo RS232, viene visto dal µP come un insieme di 10 registri consecutivi, indirizzabili in Isolated-I/O; alcuni registri condividono lo stesso indirizzo, e sono selezionati in base alle operazioni in
corso:
-
l'indirizzo di base relativo alla porta COM1 è nei byte RAM 1024 -1025 (040016 - 040116) : generalmente
03F816 .
-
l'indirizzo di base relativo alla porta COM2 è nei byte RAM 1026 -1027 (040216 - 040316) : generalmente
02F816 .
| base+0 |
TXR |
Registro
di Trasmissione (write); invia i dati sulla porta seriale |
|
base+0 |
RXR |
Registro di Ricezione (read); preleva i dati dalla porta seriale. |
|
base+0 |
DLL |
Divisor Latch Low: byte basso del “baud rate divisor”. |
|
base+1 |
DLH |
Divisor latch High : byte alto del “baud rate divisor”. |
|
base+1 |
IER |
Interrupt Enable : definisce l’abilitazione degli Interrupt. |
|
base+2 |
IIR |
Interrupt Identification : identifica gli Interrupts. |
|
base+3 |
LCR |
Line control : inizializza la porta seriale. |
|
base+4 |
MCR |
Modem control : trasmette i segnali di controllo al modem. |
|
base+5 |
LSR |
Line Status : verifica lo stato della porta seriale. |
|
base+6 |
MSR |
Modem Status: verifica lo stato del modem. |
Registri TX e RX
Il Registro di Trasmissione ed il Registro di Ricezione condividono lo stesso indirizzo di I/O: durante le operazioni di trasmissione l’istruzione
OUT attiva il segnale di Write ed il valore sul bus dati viene scritto in TXR; durante le operazioni di ricezione, l’istruzione
IN attiva il segnale di Read ed il contenuto di RXR viene copiato sul bus dati.
Registro Divisor Latch
I registri per la programmazione del "Baud Rate" sono attivi solo quando l'Access-Bit del Divisor-Latch è ON. DLAB è il bit 7 del registro LCR.
La velocità base del generatore di clock dell’interfaccia è pari a 115200 baud.
Per ottenere le altre velocità occorre fissare un fattore di divisione della velocità.
Ad esempio, per ottenere 9600 baud occorre:
-
settare a 1 DLAB;
-
inserire 12 nel registro “Divisor Latch” (0 in DLH e 12 in DLL);
-
resettare a 0 DLAB.
Registro Interrupt Enable
IER seleziona gli eventi in concomitanza dei quali occorre attivare un Interrupt hardware verso il sistema.
MSB 7 |
0 |
|
6 |
0 |
|
5 |
0 |
|
4 |
0 |
|
3 |
. |
1 = Interrupt quando cambia lo stato del modem (registro MSR) |
2 |
. |
1 = Interrupt quando viene riscontrato un errore sui dati |
1 |
. |
1 = Interrupt quando il transmitter holding register è vuoto |
LSB 0 |
. |
1 = Interrupt quando viene riscontrato un errore sui dati |
Registro Interrupt Identification
IIR contiene le specifiche dell’evento che ha generato l’interrupt hardware, e può essere interrogato dalla CPU per attivare la relativa procedura:
MSB 7 |
0 |
|
6 |
0 |
|
5 |
0 |
|
4 |
0 |
|
3 |
0 |
|
2 |
.
.
|
00 = è variato lo stato del modem(registro
MSR)
01 = il transmitter holding register è vuoto
10 = è stato ricevuto un dato nel receive holding register
11 = è stato riscontrato un errore sui dati o è stato ricevuto un
break |
1 |
LSB 0 |
. |
1 = Interrupt Pending |
Registro Line Control
MSB 7 |
DLAB |
0 = indirizzo 0 per Tx e Rx, indirizzo 1 per IER
1 = indirizzo 0 e 1 per Baud Rate Divisor |
6 |
0 |
|
5 |
0 |
|
4 |
Parità |
00 = Controllo di parità disabilitato
01 = controllo parità Dispari
11 = controllo parità Pari |
3 |
2 |
Stop |
0 = 1 Stop Bit 1 = 2 Stop Bit |
1 |
Codice |
00 = Dati a 5 bit 01 = Dati a 6 bit
10 = Dati a 7 bit 11 = Dati a 8 bit |
LSB 0 |
Registro Modem output Control
MSB 7 |
0 |
|
6 |
0 |
|
5 |
0 |
|
4 |
. |
Chiede al modem di restituire in Input i dati che vengono trasmessi in Output (loopback per verifica) |
3 |
. |
Int Enable : Questo bit deve essere attivato per permettere alla scheda di trasmettere gli interrupt al sistema |
2 |
. |
Output ausiliario |
1 |
. |
Request To Send : il computer vuole trasmettere dei dati |
LSB 0 |
. |
Data Terminal Ready : il terminale è pronto a comunicare |
Registro Line Status
MSB 7 |
. |
Time out (se settato, tutti gli altri bit non sono significativi) |
6 |
. |
1 = il registro Shift di Trasmissione è vuoto |
5 |
. |
1 = il registro Hold di Trasmissione è vuoto |
4 |
. |
1 = Break detect |
3 |
. |
1 = Framing error: non riscontrato lo Stop bit |
2 |
. |
1 = Parity error : disturbi sulla trasmissione |
1 |
. |
1 = Overrun error: un registro dati è stato sovrascritto |
LSB 0 |
. |
1 = Data Ready: il registro Hold di ricezione è pieno |
Registro Modem Status
MSB 7 |
. |
1 = il modem riceve il segnale di linea (Carrier Detect) |
6 |
. |
Ring indicator |
5 |
. |
DSR Data Set Ready |
4 |
. |
CTS Clear To Send |
3 |
. |
Il segnale di linea è cambiato |
2 |
. |
trailing edge ring detector |
1 |
. |
delta Data Set Ready |
LSB 0 |
. |
delta Clear to Send |