Alla scoperta dell’RS232

RS232 comunicazione seriale asincrona

Questo articolo è l’inizio di un viaggio alla scoperta delle comunicazioni seriali e dell’RS232. Come funziona, che tipo di informazioni trasmette e come sono organizzate sono alcune delle nozioni di cui ci occuperemo, in particolare, oggi. Il punto di arrivo di questa breve “serie” di articoli sarà la realizzazione di uno sniffer RS232 con un hardware del quale parleremo a tempo debito. Capiremo, quindi, come si potranno leggere i bit e ritrasmetterli intercettando le comunicazioni. Siete pronti?

Introduzione al protocollo

Il protocollo di comunicazione RS232 è definito come un metodo di comunicazione seriale asincrono.
Quando si utilizza la parola seriale per parlare di un metodo di comunicazione si vuole significare che l’informazione viene inviata 1 bit per volta, quindi un bit dopo l’altro. L’aggettivo asincrono, invece, sta ad indicare che l’informazione non viene inviata utilizzando intervalli di tempo (slot) predefiniti e che siano rigidamente uguale a loro stessi non soltanto nella durata ma anche nella scansione temporale. Il trasferimento dei dati può cominciare in qualunque momento; sarà compito del ricevitore rilevare quando il messaggio comincia quando finisce. Ovviamente esistono diversi modi per fare questo ma prima di capire come fare la rilevazione è importante capire come è fatto un messaggio che transita su protocollo RS232.

Le specifiche

Lo standard RS232 descrive un metodo di comunicazione all’interno del quale l’informazione viene inviata, associandola a bit, su canali fisici. L’informazione deve essere divisa in parole la cui lunghezza non sarà fissa. Sul computer viene “selezionata” una lunghezza, compresa tra 5 ed 8 bit. Per riuscire ad effettuare un trasferimento ottimale devono essere utilizzati ulteriori bit. Come sappiamo, infatti, 1 bit che transiti su un mezzo trasmissivo, o su un canale di comunicazione rischia, talvolta, di non arrivare oppure di esser corrotto. Onde evitare queste problematiche, esistono diversi metodi che permettono di garantire che l’informazione transiti in maniera corretta o che, quanto meno, una volta che ci sia un errore, questo possa essere facilmente rilevato anche in funzione di una richiesta successiva di ritrasmissione.
Altri bit aggiuntivi vengono utilizzati per la sincronizzazione ed è molto importante che il trasmettitore ed il ricevitore utilizzino la stessa lunghezza di parola, comprensiva dei bit aggiuntivi che abbiamo utilizzati per effettuare il controllo. È appena il caso di sottolineare che, se così non fosse, avremmo certamente un problema di interpretazione sbagliata oppure di completa mancanza di riconoscimento del messaggio.
Nel caso di comunicazioni sincrone, viene utilizzato un segnale di clock, oppure un istante di trigger, per indicare l’inizio di ciascun trasferimento dei dati. In sistemi di questo tipo, l’assenza dell’evento che segnala l’inizio della trasmissione implica che non ce ne sarà una.
Nei sistemi asincroni, invece, questo non viene utilizzato e ciò comporta anche una semplificazione del sistema, visto che l’utilizzo di clock specifici richiede linee dedicate.

Uno svantaggio, come si intuisce da quanto detto precedentemente, è rappresentato dal fatto che il ricevitore potrebbe cominciare a leggere il segnale ricevuto in momenti non utili e quindi l’informazione rischia di esser persa. Per ovviare a questi problemi potrebbe essere utile pensare a risincronizzazioni, che però sono procedure che portano via tempo e rallentano la velocità globale dell’intero sistema. Inoltre, un altro problema è rappresentato dal fatto che tutti i dati che ricevuti nel periodo di risincronizzazione vengono certamente persi.

I bit che rappresentano i dati vengono inviati con una frequenza predefinita, che tutti noi conosciamo essere il baud rate.
Esiste una differenza non trascurabile tra baud rate e bit rate e questo dipende dal fatto che il bit è uno non soltanto come valore ma anche come simbolo. Nei sistemi in cui si utilizzano codifiche a più simboli, invece, si utilizza il baud rate per identificare il fatto che questo rappresenta il numero di simboli al secondo non il numero di bit al secondo. Ciascuna forma d’onda può essere associata ad un simbolo ma non è vero che ciascun simbolo corrisponde ad una sola forma d’onda. In altre parole, quello che si verifica è che il bit rate ed il baud rate coincidono se e soltanto se il sistema è a due livelli.

Sia il trasmettitore sia il ricevitore devono essere programmati per utilizzare la stessa frequenza di simbolo, sia che si tratti di baud rate sia che si tratti di bit rate. Una volta che i bit vengono ricevuti, spetta al ricevitore calcolare quali sono gli istanti di ricezione degli altri bit che completano la parola, ed ovviamente quelle successive. In questa fase verranno controllati i livelli di tensione sulle linee di trasmissione.

Nel caso del protocollo RS232, il livello di tensione sulla linea può avere due stati: il primo, cui ci si riferisce anche con il nome di mark, ed il secondo noto anche come space. Quando la linea è nello stato idle le si associa il mark. Questo protocollo non prevede altri stati possibili.

La trasmissione comincia

Come abbiamo detto prima, RS232 è definito come un tipo di comunicazione asincrona e questo vuol dire che l’invio di una parola può cominciare in qualunque momento. Se ciò è vero per l’inizio non altrettanto varrebbe per il ricevitore. Ciò potrebbe, infatti, creare qualche problema al ricevitore nel capire qual è l’istante in cui deve iniziare a ricevere. Per risolvere questo problema ciascuna parola viene fatta precedere da bit di controllo che segnalano al sistema che una nuova parola sta arrivando. Possiamo indicare questi bit come bit di allerta e vengono chiamati “start bit”. Essi vengono identificati da uno “space line level”. Dato lo stato idle del sistema, questa sequenza può essere facilmente riconosciuta.

Immediatamente a seguire questa stringa ci sono i bit di dati. Un valore pari a 1 porta la linea nel mark state mentre il valore 0 viene rappresentato dallo space. Il bit è meno significativo è sempre il primo inviato. Questa scelta viene fatta per garantire che la maggior parte dell’informazione sia comunque preservata. Se, infatti, il primo bit è il meno significativo, e nel sincronizzarsi o rilevare la trasmissione il ricevitore dovesse “perdere tempo”, allora i bit che perderebbe sarebbero quelli che portano meno informazione. A seconda di quanti ne vengono persi questo potrebbe voler dire anche che la quantità di informazioni effettivamente persa non è eccessivamente “grande” e questo potrebbe non essere inficiante il messaggio.

Scopo della trasmissione è anche quello di garantire che ciò che si è ricevuto sia corretto. Per fare questo è necessario rendere le stringhe, in qualche modo, autosufficienti, garantendo loro di poter essere riconosciute per valide e suggerendo al sistema che riceve una qualche maniera per riconoscere un messaggio non valido. Per fare tutto questo è possibile aggiungere bit ulteriori alla parola in modo che essa venga allungata automaticamente. Il trasmettitore, allora, calcola il valore del bit da aggiungere in funzione dell’informazione che viene inviata. Il ricevitore effettua la stessa operazione in modo tale da controllare se il bit detto di “parità” corrisponda al valore calcolato. Lo vedremo meglio più avanti ma come anticipazione possiamo dire che lo scopo è quello di individuare se effettivamente ci sia parità pari o parità dispari.

Se sò che il ricevitore ha perso il bit di inizio, per via del rumore magari, è possibile che esso non si accorga del fatto che la parola è effettivamente cominciata. Significa che si accorgerà che la parola è arrivata almeno al bit immediatamente successivo. Questo evidentemente causerà dati non corretti al ricevitore ed un meccanismo per la risincronizzazione si rende assolutamente necessaria. Per fare questa operazione viene introdotto un meccanismo di “framing”. Significa che tutti i bit che fanno parte del dato o dell’informazione, compresi quelli di parità, sono contenuti in un frame di bit start – stop. Il periodo di tempo che intercorre tra un bit di start ed uno di stop è costante e viene definito in funzione del baud rate e del numero di dati oltre che ai bit di parità. Il bit di start ha sempre valore space, il bit di stop ha sempre il mark value.

Se il ricevitore rileva un valore diverso da mark quando si aspetta di trovarlo, allora saprà che c’è stato un errore di sincronizzazione. A quel punto ci sarà un, cosiddetto, framing error nella ricezione UART (Universal Asynchronous Receiver-Transmitter).

Il ricevitore, quindi, proverà ad effettuare una risincronizzazione sui bit che stanno arrivando. Per fare ciò, il ricevitore dovrà scandire i dati in arrivo per verificare se ci sono dei bit di start e stop validi. Questo funziona fintanto che c’è una sensibile variazione nella sequenza di bit all’interno della parola. Se, per esempio, dovessimo mandare ripetutamente il valore zero allora non avremo la possibilità di riuscire a fare risincronizzazione perché non ci sarebbe molta distinzione tra i bit e quindi sarebbe difficile rilevare un pattern.

Gli stop bit, che identificano la fine di un data frame, possono avere lunghezze differenti; d’altronde non si tratta di 1 bit reale ma di un periodo di tempo minimo in cui la linea deve rimanere nello stato idle (quindi mark) alla fine di ciascuna parola.

Su PC questo periodo di tempo può avere tre lunghezze differenti: può durare, infatti, il tempo di 1 bit, 1.5 bit oppure 2 bit. La seconda possibilità viene utilizzata solamente con parole di 5 bit di lunghezza. La terza, invece, viene utilizzata solo con parole sono molto più lunghe. È comunque possibile utilizzare la durata di 1 bit per qualunque tipo di parola, indipendentemente dalla sua lunghezza.

L’RS232 fisicamente

Lo standard di comunicazione RS232 può essere utilizzato in differenti ambienti e questo ha il suo “impatto” sulla massima tensione disponibile ai pin. Nella sua declinazione originale, anche per le possibilità tecniche del tempo, fu definito che il massimo baud rate che questo standard poteva sopportare era di 20 kbps. Ovviamente i dispositivi odierni possono lavorare tranquillamente con una velocità massima di 1.5Mbps, come ad esempio la UART 16550A.

Per quanto riguarda le tensioni, i livelli dei pin possono trovarsi in due stati: un bit alto, o mark state, che viene identificato da una tensione negativa, oppure un bit basso, lo space state, indicato da un valore alto. Questo potrebbe generare confusione ma si tratta di una mera convenzione al pari di quella che si utilizza quando, per sistemi digitali, si sceglie la logica positiva o quella negativa.

Livello

Transmitter (V)

Receiver (V)

Space state (0)

+5 … +15

+3 … +25

Mark state (1)

-5 … -15

-3 … -25

Non definito

-3 … +3

Il massimo swing sulla tensione che si possa generare (da parte del PC) sulla porta può avere diverse conseguenze, tra cui influenzare la massima lunghezza permessa ed anche la massima velocità di funzionamento del protocollo. Inoltre, se la differenza di potenziale è bassa in modulo, allora è possibile che ci sia distorsione sui dati.

Nonostante i valori di tensione così alti presenti sulla porta non è effettivamente possibile distruggerla nel caso in cui dovesse verificarsi un cortocircuito. Soltanto l’applicazione di tensioni esterne con alti valori di corrente associati potrebbe eventualmente bruciare i chip di driver.

Parlavamo, prima, della massima lunghezza dei cavi possibile; sappiamo che per qualunque protocollo di comunicazione questa è una cosa della quale dobbiamo tener conto ed anche per il protocollo di comunicazione RS232 esiste una massima lunghezza possibile. Utilizzando le unità di misura imperiali, possiamo dire che la massima lunghezza del cavo si aggira intorno ai 50 ft, il che corrisponde ad una capacità di 2500 pF.

(a beneficio di tutti, ricordo che 1 piede corrisponde a 0.3048 metri, ovvero, sostanzialmente, per sapere quanto vale, circa, in metri una lunghezza espresse in piedi dovrete dividere per tre.)

Questo vuol dire che utilizzare il cavo con un basso valore di capacità permette di percorrere distanze più lunghe senza avere le limitazioni nell’efficacia della comunicazione (il che è un principio piuttosto generale ed applicabile sempre alle linee di trasmissione).

Un esempio, dato giusto per completezza, è rappresentato dal cavo UTP CAT-5, la cui capacità tipica è di 17 pF/ft; questo implica che la massima lunghezza possibile per il cavo sarà di 147 ft.

La lunghezza della quale abbiamo parlato è riferita alla massima velocità di comunicazione che lo standard possa supportare. Questo vuol dire che se la velocità venisse ridotta di un fattore 2 o magari 4, o superiori, la lunghezza massima possibile diventerebbe certamente superiore. Secondo i dati che riporta la Texas Instruments, la massima lunghezza possibile per il cavo dipende, infatti, dal baud rate, secondo le cifre che vengono riportate nella tabella che segue. Queste sono state ricavate da alcuni esperimenti pratici che sono stati condotti anni addietro.

Baud rate
(bps)

Massima lunghezza
del cavo (m)

19200

15,24 (50 ft)

9600

152,4 (500 ft)

4800

304,8 (1000 ft)

2400

914,4 (3000 ft)

Scoviamo gli errori

Come abbiamo già detto, una delle cose più importanti che possiamo riuscire a fare quando comunichiamo è accorgerci degli errori che abbiamo commesso. Sistemi più evoluti, capaci di funzioni più avanzate, possono anche richiedere la ritrasmissione quando dovessero aver rilevato un errore.
Nel nostro caso, una delle maniere in cui gli errori vengono scovati è stato già discusso. Il meccanismo del frame detection, infatti, viene utilizzato per effettuare il test dei bit che stanno arrivando e si effettua, in particolare, il controllo della presenza dello start bit e dello stop bit. Per effettuare un controllo più “approfondito” viene utilizzato il bit di partita. L’utilizzo di questi bit, tuttavia, non è affatto obbligatorio. È possibile scegliere se utilizzarli e quali usare. Nel momento in cui, per esempio, dovessimo essere sicuri che la probabilità di sbagliare è davvero molto bassa, per esempio quando siamo all’interno di un sistema con brevi tratte di comunicazione e sul quale le informazioni che transitano sono strettamente controllate, o magari all’interno di uno stesso sistema tipo modem, oppure ancora se per caso dovessimo essere all’interno di un sistema più grande in cui c’è un protocollo di livello più alto che effettua la correzione degli errori, si può utilizzare una velocità di comunicazione più alta associando alle posizioni dei bit di controllo ulteriori bit di segnale. Questo vorrebbe dire, sostanzialmente, che il baud rate verrebbe aumentato.

La parità è un modo semplice per codificare una parola e rilevare eventuali errori nell’informazione. Il metodo utilizzato con le comunicazioni seriali aggiunge 1 bit a ciascuna parola. Il valore del bit dipende dal valore della parola stessa pertanto sarà necessario che sia il trasmettitore sia il ricevitore utilizzino lo stesso algoritmo per calcolare il valore del bit di parità, come avevamo accennato all’inizio. In caso contrario, il ricevitore potrebbe trovare degli errori che, in realtà, non sono affatto presenti.

Di parità ne esistono di due tipi: la parità pari e la parità dispari. Praticamente, si può calcolare il bit di parità in due modi diversi: quando utilizziamo la parità pari, il numero dei bit di informazione inviato dovrà contenere un numero pari di valori logici sono 1. Se il numero di valori alti è dispari, allora il bit di parità verrà posto ad 1 in modo tale da rendere il numero totale di bit codificati con valore logico alto pari. Si intuisce facilmente che nel caso di parità dispari faremo esattamente il contrario, ovvero il numero totale di 1 dovrà essere dispari.

Il metodo della parità utilizzato, tuttavia, dimostra di essere svantaggioso sotto certi punti di vista. In particolare, questo sistema non è in grado di trovare tutti gli errori che possono verificarsi nella comunicazione. Gli unici errori che potranno essere rilevati saranno quelli che influiranno in modo tale da alterare contemporaneamente un numero dispari di bit, nel caso della parità pari, ed un numero pari di diritto nel caso della parità pari.

Questo, in realtà, potrebbe anche essere un vantaggio ma la verità è che se la probabilità di errore è comunque bassa, la probabilità di sbagliare 2 bit all’interno della stessa parola, considerato che la trasmissione di ciascun bit è un evento indipendente ed incorrelato rispetto alla trasmissione del successivo, risulta dal prodotto delle due. Quindi, se la probabilità di errore associata ad un solo bit fosse dell’ordine di 1ppm, questo vorrebbe dire che la probabilità di sbagliare 2 bit è dell’ordine di 10e-12. A questo punto, poiché l’errore è dato da componenti aleatorie, è molto più intelligente provare ad abbassare la probabilità di errore in ricezione sul singolo bit, ovvero diminuire la rumorosità del sistema, piuttosto che cercare di introdurre altri bit di controllo.

Il secondo problema è rappresentato dal fatto che non c’è modo di sapere quali bit sia sbagliato, anche ammesso che sia uno solo. Se necessario, ma questo dipende dalla specifica applicazione, potrebbe essere utile introdurre un protocollo che informi il trasmettitore di quale bit di informazione debba essere trasmesso. Stiamo parlando, quindi, di un algoritmo intelligente che sia in grado di capire quale dei bit sia stato ricevuto male e magari di richiedere la ritrasmissione soltanto per quell’unico bit, anche ammesso che sia uno solo.

Pertanto, su linee di trasmissione molto rumorose, vengono utilizzati altri sistemi di rilevazione per garantire che l’informazione inviata venga ricevuta in maniera corretta. In particolare conosciamo diversi sistemi di codifica che possono aiutare; essi si dividono sostanzialmente in due categorie, ovvero quelli che introducono la ridondanza ed il controllo ciclico e quelli che effettuano la codifica di Hamming.
Nel primo caso ci sono una serie di bit inframmezzati nella sequenza e che effettuano, ciascuno, un controllo della stessa.

Nel secondo caso, a seconda della lunghezza della parola, soltanto alcune parole dell’intero alfabeto ottenibile da quel numero di bit sono ritenute valide. In particolare, come noto, in questo caso si utilizzano soltanto le parole di codice con distanza fissa tra di loro, ovvero tutte quelle parole che si differenziano per due bit.

Alla prossima

Per oggi ci fermiamo qui. Lo scopo di questo breve articolo è stato quello di “piazzare” tutti i paletti utili per chiarire i concetti di base della comunicazione seriale su RS232. La prossima volta cercheremo di capire come possiamo creare uno sniffer, cosa vuol dire realizzarne uno, che problematiche potremmo incontrare e come si possono risolvere. Una volta fatto questo entreremo nel vivo della questione analizzando uno sniffer RS232. Alla prossima.

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

7 Comments

  1. Emanuele Emanuele 17 gennaio 2013
  2. delfino_curioso delfino_curioso 17 gennaio 2013
  3. fabio giannuzzi 18 gennaio 2013
  4. Piero Boccadoro Piero Boccadoro 20 gennaio 2013
  5. Boris L. 21 gennaio 2013
  6. Stefano_Salsi 10 aprile 2013
  7. Emanuele Emanuele 10 aprile 2013

Leave a Reply