La comunicazione assume un elemento chiave per l’uso remoto di servizi digitali, come nel caso dei BBS, ma lo è anche per ogni singolo computer, per quanto rudimentale o minimale possa essere. E’ grazie ad essa che possiamo fare colloquiare unità centrale e periferiche e, all’interno stesso del computer, i singoli moduli che lo compongono (come CPU e memoria).
Esistono due grandi famiglie: parallela e seriale.
Agli inizi dell’era dei personal computer, la parte da leone era affidata a quella parallela, in cui più bit vengono trasferiti contemporaneamente su linee dati dedicate. Un esempio tipico di quegli anni è l’interfacci LPT (line printer terminal) per la stampante, detta anche Centronics, dal nome della azienda che l’ha sviluppata. Era in origine unidirezionale, e quindi poteva essere impiegata solo per inviare dati ad una periferica. Solo successivamente, in risposta alle aumentate esigenze comunicative, si è evoluta in un forme più avanzate che consentivano anche trasferimenti bidirezionali dei dati. Si è affermata come standard proprio grazie al fatto che fu scelta come interfaccia standard per stampante nel progetto del primo PC IBM.
Proprio grazie alla sua semplicità è facile comprendere la logica della comunicazione parallela. L’interfaccia ha 8 linee di dati, in modo da poter trasferire un byte per volta, ed alcune linee di controllo: strobe, busy e ack. Per inviare un dato, il computer scrive il byte da trasferire negli 8 bit della linea dati, ed invia un impulso sulla linea strobe. La periferica reagisce all’impulso attivando la linea busy, legge il dato presente sulle linee dati, lo elabora e, terminata l’operazione, disattiva la linea busy inviando contemporaneamente un impulso sulla linea ack (aknowledge).
Attraverso questo semplice schema la periferica può controllare il flusso dei dati inviati dal computer in base alla sua capacità di elaborarli, ed anche di fermarlo del tutto in caso di situazioni anomale. Consentiva di raggiungere velocità di circa 150 kByte/sec.
Le interfacce parallele sono però conveniente solo se le distanze in gioco sono molto brevi, sia per il numero elevato di linee che richiedono, sia per una loro intrinseca sensibilità ai disturbi elettrici. Negli altri casi è necessario impiegare una comunicazione seriale.
Nella comunicazione seriali i bit costituenti il codice da trasmettere vengono inviati in sequenzialmente, uno alla volta. La logica è la stessa del codice morse, in cui ogni carattere è codificato in una sequenza di punti e linee (con una linea che è lunga tre punti) dalla stazione trasmittente, e decodificati nel carattere originale alla stazione ricevente. E’ in uso dalla fine dell’800 nelle telescriventi, che utilizzavano un alfabeto a 5 bit inventato da Emile Baudot: dal suo nome deriva l’unità di misura baud, che rappresenta il numero di simboli1 trasmessi per secondo. La semplificazione sul lato elettrico ha però come contraltare l’aumento significativo della complessità dell’interfaccia.
E’ infatti necessario stabilire dei criteri perché la stazione ricevente possa ricostruire correttamente la sequenza di bit da riassemblare. la funzione primaria è quella di sincronizzare la cadenza di invio dei bit da parte di chi trasmette con la stazione ricevente. Cosa che può essere fatto con due distinti metodi. Uno è la trasmissione sincrona, in cui i bit sono trasmetti allineati ad un segnale ausiliario, chiamato clock, che ne determina la scansione temporale.
Nelle comunicazioni segnali asincrona i dati sono solitamente inviati in gruppi, chiamati frame. La stazione ricevente sa che ad ogni risalita del segnale di clock c’è un bit da leggere, per cui la ricostruzione del flusso è semplice. L’organizzazione dei dati all’interno del flusso è determinata dal protocollo usato, ma solitamente ogni byte viene trasmesso dal bit più significativo (MSB) a quello meno (LSB).
Nei personal computer si è invece optato per la meno costosa trasmissione asincrona, in cui gli elementi di sincronizzazione fra trasmittente e ricevente sono inframezzati nella sequenza di bit stessa.
La stazione trasmittente prima di iniziare la sequenza di bit, comincia inviando uno o più bit di start, a questa accoda i bit del dato – solitamente dal meno significativo al più significativo. Opzionalmente può inviare un bit di parità, che è calcolato in base ai bit trasmessi, e che viene utilizzato per individuare possibili errori di trasmissione. Chiude la trasmissione accodando uno o più bit di stop.
Sul lato ricevente, la stazione rimane in attesa della sequenza di start, ricevuta la quale avvia un suo clock interno. Questo viene utilizzato come riferimento per determinare i momenti in cui rilevare il valore presente sulla linea dati. Trascorso il tempo necessario all’invio di tutti i bit si rimette in attesa di una nuova sequenza di bit. La sincronizzazione viene rigenerata ad ogni carattere, quindi le sicure fluttuazioni temporali fra trasmittente e ricevente non si sommano e, quindi, rimangono del tutto ininfluenti. Ovviamente la trasmissione asincrona è meno efficiente rispetto alla sincrona, visto che una parte del flusso dati viene utilizzata proprio per garantirne la sincronizzazione.
Questo a livello logico. A livello fisico i progettisti del PC IBM scelsero come interfaccia seriale la RS232-C, che era quella in quei tempi più diffusa per il collegamento di stampanti e terminali. RS è l’acronimo di Recommended Standard, i documenti normativi della EIA, e 232 è il numero dello standard, la lettera C la revisione, datata 1969. Il titolo reca la descrizione “Interface Between Data Terminal Equipment and Data Communication Equipment Employing Serial Binary Data Interchange”, ovvero “Interfaccia fra terminali e apparati di comunicazione che utilizzano scambio di dati digitali”.
L’RS232-C definisce tutti i parametri dell’interfaccia. Elettricamente sono tutte linee sbilanciate, con lo stato logico 1 (o mark) rappresentato da valori negativi e lo 0 (o space) da valori positivi (da 5 a 15V, ma con tolleranza sino a 25V). Oltre alle linee dati (tx,rx) sono definiti una serie di segnali di controllo, secondo lo schema seguente. Il connettore è un Cannon DB25, maschio lato DTE (computer) e femmina lato DCE (modem). E’ consigliato limitare la lunghezza dei cavi a 15m (50 piedi), ma è possibile usare senza problemi lunghezze maggiori usando cavi a bassa capacità.
Le colonne EIA e CCITT riportano la designazione USA ed Europea delle linee, che sono utilizzate solo in parte per la comunicazione seriale asincrona: quelle che ci interessano sono evidenziate dal fondo colorato. Il riferimento di massa è al pin7, i dati veri e propri vengono scambiati attraverso le linee tx data (2) e rx data (3).
Sul pin 8 è presente il Data Carrier Detect: è la linea che il modem mette a stato logico 1 quando è agganciato al suo corrispondente. E’ un segnale estremamente importante, perché è utilizzato dal DTE (nel nostro caso, il computer) per sapere se la connessione dati sia attiva o meno. E’ un dato vitale nei sistemi automatici, visto che il suo cambiamento di stato da 0 (basso) a 1 (alto) indica l’arrivo di una nuova chiamata, mentre il passaggio da 0 a 1 che una connessione attiva è caduta – per un qualsiasi motivo.
Le altre linee sono relative a due distinti circuiti di controllo del flusso. Anche la comunicazione seriale ha bisogno di metodi per regolare il flusso di dati da trasmittente a ricevente. Nello specifico, lo standard RS232-C ne mette a disposizione due circuiti basati sull’hardware: DTR/DSR e RTS/CTS . Il controllo di flusso può essere implementato anche in via software mediante l’invio di particolari codici di controllo, il più comune dei quali è basato su XON/XOFF.
Ovviamente i due circuiti hardware hanno finalità diverse. La coppia Data Terminal Ready (DTR)/Data Set Ready(DSR) gestisce la sessione di connessione. DTR è alzato dal DTE quanto è pronto ad operare, mentre DCE alza DSR a conferma che è anch’essa pronto. Se il computer alza DSR e non rileva nei tempi prestabiliti che il modem non ha alzato a sua volta il DSR, è in grado di rilevare un malfunzionamento del modem stesso.
La coppia Request To Send (RTS)/Clear To Send(CTS) è invece destinata a regolare il flusso dei dati. Il DTE alza il suo RTS quando è in condizione di ricevere dati. Il segnale viene rilevato dal DCE, che lo trasferisce al suo partner all’altro capo della connessione, che lo replicherà sul suo CTS. Il CTS alto è il segnale via libera alla trasmissione: se ci sono dati da trasmettere. Qualora il DTE non è fosse più in grado di ricevere dati, è sufficiente che porti a stato basso il suo RTS. Lo stesso stato sarà replicato sul CTS del modem partner. IL DTE remoto, leggendo lo stato basso del CTS, fermerà l’invio di nuovi dati.
Questo, almeno, secondo lo standard. La realtà è però molto più variegata. In effetti l’RS232 era nato per un uso ben preciso: collegare terminali (che nei primi anni ’60 erano in larga parte telescriventi elettromeccaniche) per mezzo di modem. Nell’adattarlo alle nuove tecnologie emergenti, molti produttori si sono prese grandi libertà in sede di implementazione. E’ quindi facile imbattersi in dispositivi con interfacce seriali che pur definite RS232, nella sostanza differiscono in modo significativo dallo standard. In ambito PC, ad esempio, fu proprio l’IBM ad optare per un connettore DE9 in luogo del DB25 per il suo 5170 AT.
Per collegare poi due DTE senza l’ausilio di modem, poi, è necessario utilizzare dei cavi con un cablaggio specifico, definito null modem. Ma anche di questi ne esistono di varie versioni. Quella corretta dovrebbe incrociare tx data e rx data e tutte le linee di controllo (CTS con RTS, DTR con DSR e DCD, più ovviamente la massa), ma se ne trovano anche con solo tre fili (TX/RX/GND), che però funzionano solo se il controllo di flusso è disabilitato.
Se oggi siamo abituati ad associare una tipologia di interfaccia con una determinata spina, una volta questo non era vero. Si usavano connettori standard industriali, che non avevano un solo uso specifico. La cosa si complicava in ambito seriale, dato che l’interfaccia presentava due cablaggi distinti (DTE/DCE), una varietà di segnali che non sempre erano implementati in modo completo e/o corretto, e la documentazione spesso approssimativa. Nella pratica, quindi, per far parlare due dispositivi seriali era spesso necessario realizzare cavi ad hoc. Per risolvere i frequenti problemi di collegamento si usava, generalmente, uno strumento che non poteva mancare nella borsa di ogni tecnico: un breakout box. Dei led, generalmente bicolore, visualizzavano lo stato della linea. Una fila di interruttori consentiva di isolare individualmente ogni linea del collegamento, e grazie ai ponticelli era possibile modificare al volo il cablaggio del cavo. Una volta noto lo schema da usare, era possibile saldare un cavo che sicuramente funzionava.
Un altro strumento semplice, ma indispensabile era il connettore di loopback, il connettore grigio al centro della foto. Spesso autocostruito, era cablato per riportare tutti i segnali in uscita su i corrispondenti in ingresso. Era sufficiente usare un semplice programma di comunicazione per testare il funzionamento delle porte seriali: se tutto funzionava bene, ogni carattere trasmesso doveva essere ricevuto correttamente.
lo standard RS232, da internet archive.
Foto ed illustrazioni di questa pagina sono mie, rilasciate su licenza CC-BY-NC-SA.
1) Per la definizione di simbolo vedi la pagina sui modem. In questo contesto un simbolo è uguale ad un bit.