Le
basi della comunicazione seriale |
In
questa serie di articoli si vedranno innanzitutto i principi
che stanno alla base della comunicazione seriale e tutte le
definizioni necessarie per comprendere l'argomento. Una volta
chiariti i concetti base si passerà ad analizzare le
funzioni di Windows che permettono la gestione della comunicazione
seriale e solo in un secondo momento verranno mostrate le
caratteristiche del controllo MSComm Questo perchè
l'utilizzo delle funzioni di Windows può rivelarsi
molto più utile del semplice impiego di MSComm per
due motivi. Innanzitutto per la maggiore flessibilità
nell'utilizzo di una serie di funzioni altamente personalizzabili
piuttosto che un blocco unico costituito dal controllo.
In secondo luogo per comprendere come avviene la comunicazione
seriale e dunque comprendere come si comporta l'oggetto MSComm,
ossia quali API utilizza quando viene utilizzato nel progetto.
In terzo luogo perchè può accadere che le caratteristiche
del controllo MSComm non siano sufficienti per raggiungere
determinati scopi in modo efficiente.
In
breve diciamo che la comunicazione seriale consente
la trasmissione e la ricezione di dati tramite una porta seriale.
Tale comunicazione avviene attraverso lo scambio di blocchi
di bit ad una determinata velocità lungo i cavi seriali
che raggiungono porte di ogni tipo in base naturalmente alle
periferiche installate sul computer.
Le porte più comuni sono quelle della tastiera, del
mouse, del video, del modem, della stampante, la porta USB
e così via.
Vediamo brevemente i principi della comunicazione seriale.
Come già detto le porte seriali connettono fisicamente
una periferica al computer e ne permettono una comunicazione
asincrona. Per comunicazione asincrona s'intende un
metodo di trasferimento dati ad intervalli regolari: l'invio
di ogni carattere alla porta (tipo RS-232) viene preceduto
dall'invio un bit che indica l'inizio della comunicazione,
e seguito dall'invio di un secondo bit che indica la chiusura
(temporanea) della comunicazione.
E naturalmente si definisce invece comunicazione sincrona
il trasferimento dati computer/porta parallela come flusso
continuo di bit.
Qual'è
la differenza tra una comunicazione seriale ed una parallela?
Nel caso di comunicazione parallela il trasferimento dei dati
avviene attraverso otto pin (ossia in pratica otto contatti)
per trasmettere gli otto bit che costituiscono un carattere
(ad esempio la lettera 'a'). Una volta arrivati alla porta
questi bit si combinano per creare il carattere.
Ad esempio vediamo come il carattere 'a' viene inviato ad
una stampante nel caso di porta parallela:
Come
si capisce dal grafico, questo tipo di comunicazione è
definita parallela perchè tutti i bit vengono spediti
alla periferica contemporaneamente ossia in parallelo (utilizzando
cioè un metodo di trasferimento sincrono).
Nel caso di comunicazione seriale invece viene utilizzato
un singolo pin in modo sequenziale. I bit che compongono il
carattere (ad esempio 'a') vengono trasferiti uno dietro l'altro
in serie. In realtà la sequenza dei passaggi è
questa: quando il computer deve trasferire il carattere 'a'
ad una periferica, trasformati i bit (che sono in parallelo)
in una sequenza di bit che, una volta raggiunta la periferica,
vengono nuovamente riportati in parallelo.
La figura sotto dovrebbe chiarire meglio il concetto:
Il
problema che nasce in questo caso è che la periferica
non capisce quando terminano i bit relativi ad un carattere
e comincia il flusso di bit relativi ad un altro carattere.
Questo non accade per la comunicazione parallela perchè
nel primo istante la periferica riceve tutti i bit di un carattere,
nell'istante successivo quelli del carattere seguente e così
via.
Ecco perchè la comunicaizone seriale dev'essere sincronizzata.
Sincronizzare
una comunicazione vuol dire impostare i tempi (o meglio, il
tipo di flusso: continuo oppure ad intervalli) nei quali avviene
il trasferimento dei dati per permettere ai due estremi comunicanti
di identificare in modo corretto il flusso di informazioni.
Come già visto poco fa i principali sistemi per sincronizzare
una comunicazione sono l'utilizzo di una comunicazione sincrona
o asincrona. Vediamoli ora nel dettaglio.
La comunicazione sincrona che come già detto consente
flusso continuo di bit è molto efficiente nel caso
di trasferimento di grosse quantità di dati. La velocità
alla quale i dati vengono trasferiti dipende naturalmente
dal blocco di informazioni che si desidera trasportare da
un estremo all'altro della comunicazione.
Il trasferimento avviene attraverso il raggruppamento di blocchi
di dati che vengono inviati ad intervalli regolari, preceduti
da caratteri speciali (denominati syn o synchronous
idle characters).
Ad esempio:
dove
naturalmente il termine 'dati' non si riferisce a singoli
bit ma a pacchetti (o blocchi) di bit.
Una volta che i caratteri syn sono ricevuti dalla periferica
vengono decodificati ed usati per sincronizzare il trasferimento
dei dati. La comunicazione asincrona invece prevede l'invio
di bit all'inizio ed alla fine del flusso in modo da indicare
l'inizio ed il termine di un carattere.
L'esempio grafico è il seguente:
Lo
stato della comunicazione è dato dal bit 1 (1 binario).
Quando però la periferica riceve uno 0 binario, allora
si mette in ascolto della serie di dati che vengono dopo.
Ecco perchè il bit d'inizio carattere è sempre
uno 0 binario e quello di fine carattere è sempre un
1 binario.
Come
abbiamo potuto vedere la comunicazione seriale è un
argomento molto tecnico. Per questa ragione conviene introdurre
altri concetti ancor prima di iniziare a lavorare su un qualsiasi
codice.
Cominciamo con la serie di parametri che intervengono nel
trasferimento di dati.
Si definisce bpc (bits per character) il numero
di caratteri utilizzato per rappresentare un unico carattere
durante una comunicazione seriale (ad esempio 7 bit oppure
8 bit).
Che differenza c'è tra un carattere espresso in 7 bit
rispetto ad uno espresso in 8? Nel primo caso è possibile
inviare solamente i primi 127 caratteri del set ASCII (nella
guida MSDN di Microsoft se ne trova la tabella sotto la voce
ASCII->Set di caratteri).
Nel secondo caso al contrario vengono inviati i caratteri
da 127 a 255. La spiegazione di tutto questo è semplicemente
che i primi (0-127) caratteri sono normalmente rappresentabili
attraverso 7 bit e i secondi (127-255) attraverso 8 bit.
Altro parametro, senza dubbio più diffuso del primo
è bps ossia bits per second. che rappresenta
un'unità di misura della velocità di trasferimento
dei dati. Viene così calcolato il numero di bit che
raggiunge la destinazione (la periferica) entro un secondo.
Andando avanti troviamo bd ossia baud rate che
corrisponde al numero di volte in cui il segnale della connessione
modifica la frequenza o il livello di voltaggio. Nel caso
in cui il segnale cambi ad ogni bit allora il baud rate coincide
con il bps.
Il
bit di parità invece, al contrario dei bit d'inizio
e fine carattere è opzionale nel processo di trasferimento
dati.
Esso ha l'unico scopo di determinare se il carattere inviato
ad una periferica è stato ricevuto in modo corretto
ed è applicabile solo alla comunicazione seriale e
naturalmente non a quella parallela.
Quindi si parla di parità nel senso di corrispondenza
(=pari numero) di dati che escono dal sistema che li invia
e che vengono ricevuti dal sistema che li riceve.
Le specifiche del bit di parità sono le seguenti:
none
|
indica
che la connessione seriale non utilizza il bit di parità
per i dati trasmessi e che quindi il sistema ricevente
non controllerà la parità per i dati ricevuti.
|
even
|
specifica
che il totale della somme degli 1 binari che formano un
singolo carattere è un numero pari. In questo caso
il bit di parità sarà impostato su 0, in
caso contrario su 1.
Ad esempio nell'invio del carattere 'a' (codice binario
1100001), il totale degli 1 è il numero dispari
3. Il bit di parità sarà quindi impostato
su 1. Se invece si invia il carattere 'A' (codice binario
1000001), il bit di parità sarà impostato
su 0. |
odd
|
simile
a even solo che questa volta il bit di parità assume
valore 0 se la somma degli 1 binari è dispari e
1 se è pari. |
space
|
indica
che il bit di parità sarà in ogni caso 0.
Questo può essere utile in caso di controllo di
errori: se il bit di parità è diverso da
0 allora si è verificato un errore. |
mark
|
simile
a space solo che questa volta il bit di parità
assume il valore predefinito 1.
|
In
realtà gran parte dei modem seriali in circolazione
utilizzano la trasmissione di caratteri a 10 bit: uno rappresentato
dal bit di inizio carattere, 7 o 8 per il carattere, 1 o 0
rappresentato dal bit di parità e 1 o 2 per la fine
del carattere.
Adesso
che è stato dato uno sguardo generale alla teoria della
comunicazione seriale si può introdurre, cosa che faremo
nel prossimo articolo il primo elemento di codice che è
rappresentato dalla funzione CreateFile per l'apertura della
connessione ad una periferica.
» "Serial
comunication general concepts"
|