ABSTRACT

Nell’articolo vedremo un esempio di codice in ambiente win32 che utilizza le chiamate standard per la gestione della porta seriale. Anche se ormai sorpassata da protocolli più moderni, rimane ancora un vasto panorama di periferiche, soprattutto in ambito industriale e dei sistemi di misura, che utilizza tale protocollo.

Le tradizionali chiamate che sfruttano le routine scritte nei BIOS dei PC non possono più essere usate nelle architetture basate su sistemi funzionanti in modalità protetta derivate da NT.

L’articolo è un breve tutorial sulla scrittura di codice che implementa le principali funzioni: impostazione dei parametri, lettura e scrittura.

Non mancano riferimenti alla teoria ed agli aspetti elettrici del protocollo.

INTRO

In ambiente industriale da sempre si trovano una miriade di dispositivi che comunicano fra loro e con i PC attraverso un protocollo molto diffuso, ben noto e sicuramente robusto: il protocollo RS232. Tale protocollo è nato molti anni fa e affonda le sue radici nella comunicazione dei terminali remoti connessi via cavo o vie telefono ad altre apparecchiature remote. La prima standardizzazione risale al 1969.

Il concetto base è utilizzare il minor numero di connessioni possibili ed al limite un solo filo, in modo che l’informazione potesse essere trasmessa su di normale cavo telefonico, con opportuni adattamenti.

Cosa è la trasmissione seriale

Diamo solo un breve cenno, rimandando ai testi di telecomunicazioni per approfondimenti.

In questo ambito richiamiamo solo alcuni aspetti basilari del protocollo.

Gli esperti di hardware saltino pure al paragrafo successivo e perdonino alcune semplificazioni.

All’interno del PC lo scambio delle informazioni avviene in una modalità detta parallela, dove un certo valore binario, composto da più bit, viene scambiato fra due o più dispositivi attraverso più fili, più piste di rame. Poiché i vari bit della parola binaria vengono scambiati nello stesso istante, diciamo che viaggiano in parallelo lungo queste piste di rame che, all’interno del PC, prendono il nome di BUS. Quindi per esempio quando il computer invia il carattere ‘A’ alla stampante, dapprima lungo il data bus vengono trasmessi contemporaneamente 8 bit:

Bus 8 fili

Questa tecnica richiede più fili, ma ha l’indubbio vantaggio di aumentare la banda: come è facilmente intuibile, il numero massimo di bit trasferibili nell’unità di tempo si ottiene moltiplicando il limite fisico proprio di ogni canale (filo) per il numero dei canali (bit/fili)

Questa tecnica non poteva essere facilmente adattata ai terminali, ossia dispositivi provvisti di tastiera (e spesso senza video) che costituivano le periferiche di input dei primi computer: avrebbero richiesto almeno 8 fili, oltre al cavo di massa ed ad uno riservato al clock di sincronismo. La velocità non era un fattore importante.

Ancor meno si adattava alla trasmissione su linea telefonica, dove i fili sono due: uno per il segnale e la massa.

La tecnologia introdusse quindi in protocollo seriale, che come suggerisce il nome, mette in SERIE, in fila, i bit:

Esiste quindi un dispositivo, ormai composto da un solo integrato (anzi addirittura all’interno di un chip ASIC con altri dispositivi nei PC attuali) in grado di serializzare i bit. Si noti che per primo è trasmesso il bit meno significativo ( LSB first ). Un circuito che opera questa conversione è un automa a stati finiti che viene realizzato con uno shift register a 8 bit.

Schema shift register

(un esempio di struttura logica di uno shift register)

Da ultimo si noti che per standard è possibile inviare anche un numero inferiore di bit: 5, 5 o 7 bit anziché 8. Questo valeva nei tempi gloriosi dl codici a 5 bit (baudot) o a 7 (ASCII, tell it "aski", please!)

 

I segnali elettrici

Naturalmente non finisce qui: il clock non viene trasmesso, altrimenti ci servirebbe un ulteriore cavo. Per ovviare all’invio del clock, il protocollo prevede che ci sia un particolare fronte di discesa, detto bit di start, ed un fronte supplementare a fine invio, detto bit di stop (il protocollo specifica che possono esserci anche due bit di stop).

La forma d’onda complessiva in uscita dallo Shift register sarà quindi qualcosa del tipo:

Forma d'onda Shift register

Il ricevente ha di solito un circuito PLL (phase locked loop) che si "aggancia" al primo fronte e poi prosegue in modo autonomo a generare i segnali di clock che "spezzeranno" la trama di bit nei singoli bit e opereranno lo shifting all’interno del ricevente: avremo quindi un circuito simmetrico, pilotato dal clock locale, che opera la conversione opposta da seriale a parallelo.

Nota: il protocollo RS232 usa due particolari simboli, detti Mark e Space:

Mark 1 logicoda -25V a –3V

Space 0 logicoda +3V a +25V

Space e Mark

Ciò è stato deciso in base a motivazioni di tipo circuitale: in tal modo la semplice disconnessione (0 volt) è subito rilevata dall’elettronica e i disturbi (sotto il volt) non sono rilevati (zona marrone di "indecisione").

Quindi su un oscilloscopio vedreste la forma d’onda "ribaltata" con ampiezza anche di 50 volt Picco-Picco.

E fin qui tanto può bastare se la comunicazione è fra PC e PC, o fra PC e modem o PC e lettore di schede magnetiche o similia.

Se poi il segnale viene inviato al modem (analogico), si avrà un ulteriore processo di conversione da digitale ad analogico, producendo delle forme d’onda adatte alla linea telefonica. Nel caso più semplice è possibile associare una frequenza sinusoidale a Mark ed una a Space, ottenendo la modulazione frequenza. (Attualmente non più usata: ce ne sono altre, come la QAM che non commentiamo in questa sede).

Forma d'onda

La forma d’onda risultante è più "fitta" (frequenza più alta) p.es. Mark, e meno fitta (frequenza inferiore) per lo Space.

 

La velocità: definizioni

Nelle trasmissioni dati danno due unità di misura: Bps (bit al secondo) e baud.

Spesso nei testi i due termini sono confusi, ma NON sono lo stessa cosa.

Baud: il numero di cambiamenti di stato elettrico della linea.

Bps: il numero di bit effettivamente inviati. Può sembrare lo stesso ma NON lo è. Infatti alcuni tipi di modulazione inviano più informazioni associate alla singola variazione (p. es. utilizzando modulazione multi-livello) e quindi se p. es. si hanno 4 valori di ampiezza, è possibile trasmettere 2 bit per variazione di livello, ossia il DOPPIO dei bit.

Ovviamente all’utente interessano i bit effettivi, ossia i Bps.

Poiché nel nostro caso NON facciamo mai riferimento alla modulazione, possiamo tranquillamente mischiare i due termini: abbiamo solo 0 e 1 e non multilivello.

 

La velocità fra i due dispositivi

Il protocollo prevede varie velocità operative, dai vecchi 75 baud (in effetti bit/sec… ) fino ai più moderni 115.200 baud. Poiché il ricevitore non sa nulla della velocità né può ricavarla dal puro invio di bit, è necessario settare manualmente tali velocità su entrambi gli apparecchi.

Infatti se p. es. nel nostro invio di una ‘A’ trasmettessimo a 4800 baud e il ricevente fosse settato a 9600, quest’ultimo vedrebbe il doppio dei bit e quindi utilizzerebbe i primi 4 bit trasmessi per generare il Byte e dovrebbe aspettare il fronte di salita del bit 6 come se fosse lo stop: avremmo quindi qualcosa del tipo 00110000 che non è certo la ‘A’.

 

Il controllo degli errori di trasmissione

Il protocollo prevede un grezzo meccanismo di controllo degli errori, o meglio di semplice rilevazione di errore. Alla fine della trama dei bit il trasmettitore calcola un bit supplementare, detto bit di parità. Il concetto è il seguente.

Il bit di parità P vale 1 o zero in modo che il totale degli 1 sia Pari (parità pari) o sia

sia Dispari (parità dispari).

Quindi se per es. si è impostato parità pari, e si invia la famosa ‘A’ ( 01000001) , che ha già due 1, il bit sarà zero. (totale degli uni = 2+0 = 2, pari).

Se si imposta il dispositivo per la parità dispari, P deve essere 1:

2+1 = 3 numeri di 1dispari.

Il trasmettitore quindi invia un bit in più in coda agli 8 bit (sia P pari) :

Il ricevente riceve la sequenza di bit, conta ai primi 8 (ovviamente anche il numero di bit deve essere impostato uguale) e ricalcola la parità P’.

SE P’ = P suppone che l’invio sia corretto, se P<>P’, si suppone un errore di invio e l’errore viene propagato agli strati superiori. Quindi con ALTRE tecniche il ricevente segnalerà un errore al trasmettitore che banalmente re-invierà tutto il byte. Notiamo che in caso di errori doppi il sistema non si accorgerà di nulla!

Per ovviare a ciò gli strati superiori solitamente usano algoritmi più efficaci di controllo e recover degli errori. (CRC, codici polinomiali…)

 

I cavI

Senza dilungarci troppo, diciamo solo che esistono vari tipi di connessioni fra dispositivi seriali, che collegano due entità diverse.

Si parla di

  • DTE (Data Transmission Equipment, il PC)
  • DCE (Data Communication Equipment, il modem o altra apparecchiatura)

La logica è connettere un DTE ad un DCE.

Per tale connessione lo standard prevede un connettore con un notevole numero di segnali: si noti che NON sono segnali dedicati ai dati, ma alla sincronizzazione fra DTE e DCE. Lo standard prevede i seguenti segnali, che citiamo senza commento: rimandiamo ai testi di comunicazioni.

 

Acronimo

Termine Inglese

Direzione

Descrizione

TxD

Transmit Data

Freccia dx

Invio bits

RxD

Receive Data

Freccia sn

Ricezione bits

RTS

Request To Send

Freccia dx

controlo di flusso RTS/CTS

CTS

Clear To Send

Freccia sn

controlo di flusso RTS/CTS

DSR

Data Set Ready

Freccia sn

PC Pronto a comunicare

DTR

Data Terminal Ready

Freccia dx

Terminale pronto a communicare

DCD

Data Carrier Detect

Freccia sn

Il Modem ha rilevato la portante

RI

Ring Indicator

Freccia sn

Squilla la linea

SG

Signal Ground

 

 Massa

Lo standard prevede che per es. il terminale TxD del PC sia connesso al terminale RxD del modem e viceversa.

I cavi possono utilizzare più configurazioni, dette usualmente a 9, 7, 5 e 3 fili. Rimandiamo alla Bibliografia [2] per alcuni schemi.

Il più semplice cavo è a 3 fili:

Connettore di SX

Connettore di DX

 

2 (Rx)

3 (Tx)

Rx

Freccia sn

Tx

3 (Tx)

2 (Rx)

Tx

Freccia dx

Rx

5

5

Massa

Connessioni cavo

 

Il più semplice cavo a 3 fili da utilizzare è detto null modem, appunto perché simula la presenza (o meglio la assenza!) di 2 modem intermedi.

 

Cavo null modem

 

La particolare connessione dei terminali fa credere ad ognuno dei due PC di parlare col rispettivo modem e simula che ci sia un interscambio fra questi ultimi due:

 

Connessioni cavo null modem

 

Questo cavo incrocia appunto dei segnali, garantendo un minimo di handshake. (si veda [2] per una dettagliata spiegazione).

 

RIFERIMENTI

  1. EIA232E - Interface Between Data Terminal Equipment and Data Circuit-Terminating Equipment Employing Serial Binary Data Interchange, revised from EIA232D, July 1991. Application notes for the EIA232 standard, formerly Industrial Electronics Bulletin #9
  2. http://www.lammertbies.nl/comm/cable/RS-232.html