Hlavní navigace

Komunikace pomocí sériového portu RS-232C podruhé

11. 12. 2008
Doba čtení: 12 minut

Sdílet

V dnešní části seriálu o architekturách počítačů dokončíme téma sériové komunikace pomocí standardního portu RS-232C. Řekneme si, jakým způsobem lze řídit přenos dat, a to jak pomocí signálů DTR/DSR či RTS/CTS, tak i programově - většinou s využitím řídicích ASCII znaků označovaných kódy X-ON a X-OFF.

Obsah

1. Komunikace pomocí sériového portu RS-232C podruhé
2. Softwarové řízení přenosu dat
3. Hardwarové řízení pomocí signálů RTS/CTS
4. Hardwarové řízení pomocí signálů DTR/DSR
5. Podpora sériové komunikace v operačních systémech
6. Literatura a odkazy na Internetu
7. Obsah další části seriálu

1. Komunikace pomocí sériového portu RS-232C podruhé

V předchozích dvou částech tohoto seriálu jsme si popsali nejpoužívanější způsoby posílání dat pomocí sériového portu RS-232C. Víme již, že základem komunikace přes tento port je simplexní (jednosměrný), poloduplexní či plně duplexní asynchronní přenos dat, která jsou vysílána na pin TxD a přijímána na pinu RxD (vysílané znaky či bajty jsou automaticky rozloženy na jednotlivé bity přenášené v sériové formě, počínaje nejnižším bitem). K přenášeným datům může být v případě potřeby doplněn paritní bit, přičemž komunikační asynchronní protokol je rozšířen i o takzvané start a stop bity, které slouží k synchronizaci vysílacího a přijímacího zařízení (přítomnost stop bitu navíc dává přijímací straně dostatek času na uložení právě načteného bajtu do vyrovnávacího datového registru či datové fronty – FIFO – a vygenerování přerušení pro komunikační program). Teoreticky by pro simplexní či poloduplexní přenos dat postačovalo použít pouhé dva vodiče a u režimu plně duplexního tři vodiče, ovšem v některých případech – především při požadavku na vyšší přenosové rychlosti a větší odolnost proti ztrátě dat během přenosu – je komunikační kanál doplněn i o další signály, které slouží k řízení přenosu dat. Nejčastěji používané (a do jisté míry standardizované) způsoby řízení přenosu dat si ukážeme v následujících třech kapitolách.

pc4101

Obrázek 1: Význam jednotlivých pinů konektoru DB-9/DE-9 v případě, že je využívaný sériovým portem. Tento konektor se v minulosti používal i pro další účely, jeho „inverzní“ varianta například sloužila k připojení monitoru ke grafickým kartám typu CGA.

Kromě vlastního asynchronního sériového přenosu dat, prováděného přes piny TxD a RxD (data transmitter, data receiver), je možné další signály vyvedené na piny konektoru sériového portu (DB-25, RJ-45, nejčastěji však DB-9/DE-9) použít pro přímé ovládání připojených zařízení či naopak pro čtení aktuálního stavu těchto zařízení. U standardního sériového portu jsou piny buď vstupní, nebo výstupní; většinou není možné přepnout funkci pinu ze vstupního na výstupní či naopak (naproti tomu u rozšířeného paralelního portu to bylo možné). Z hlediska programování sériového portu se stav vstupních pinů (konkrétně se jedná o piny CTS, DSR, DCD a RI) zapisuje do konfiguračního registru adresovatelného na offsetu 6 počítaného od bázové adresy sériového portu – viz následující dvě tabulky), výstupní piny (DTR a RTS, které mohou být doplněné o uživatelsky ovládané piny OUT1 a OUT2) lze ovládat pomocí registru adresovatelného na offsetu 4 počítaného též od bázové adresy).

Bázové adresy prvních čtyř sériových portů, které mohou být rozpoznatelné BIOSem při startu počítače (některé BIOSy však rozeznají pouze první dva sériové porty):

Port Bázová I/O adresa od Bázová I/O adresa do Přerušení
COM1 0×3f8 0×3ff IRQ4
COM2 0×2f8 0×2ff IRQ3
COM3 0×3e8 0×3ef IRQ4, IRQ5 nebo IRQ7
COM4 0×2e8 0×2ef IRQ3, IRQ5 nebo IRQ7

Každý standardní sériový port se ovládá pomocí sedmi konfiguračních registrů, jejichž adresy v I/O prostoru (!) jsou počítány relativně od bázové adresy daného portu:

Port (offset) Adresa pro COM1 Adresa pro COM2 čtení zápis význam
+0 0×3f8 0×2f8 ano ano vysílací a přijímací registr, dolní bajt dělitele hodin
+1 0×3f9 0×2f9 ne ano povolení přerušení, horní bajt dělitele hodin
+2 0×3fa 0×2fa ano ne identifikace přerušení (příznak, co přerušení způsobilo)
+3 0×3fb 0×2fb ano ano řízení linky, počet stop bitů, nastavení parity atd.
+4 0×3fc 0×2fc ne ano řízení modemu – doplňkových výstupních signálů
+5 0×3fd 0×2fd ano ne čtení stavu linky – chyb při přenosu
+6 0×3fe 0×2fe ano ne čtení stavu modemu – doplňkových vstupních signálů
pc4102

Obrázek 2: Pomocí tohoto zařízení je možné sledovat komunikaci mezi počítačem a připojeným zařízením i v případě, že je použito hardwarové řízení přenosu dat pomocí signálů RTS/CTS či DTR/DSR. Povšimněte si, že chybí LED, která by sledovala stav signálu RI (Ringing Indiciator), ten totiž nebývá při přenosu dat příliš často používán.

2. Softwarové řízení přenosu dat

V minulosti se poměrně často používal poloduplexní přenos dat, při kterém byly obě komunikující strany propojeny pouhými dvěma vodiči. První vodič při tomto způsobu zapojení slouží k přenosu dat jak směrem od počítače k zařízení, tak i naopak; druhý vodič představuje signálovou zem (a to i ve všech dále zmiňovaných způsobech propojení). Na třetím obrázku je ukázáno, jakým způsobem jsou obě komunikující strany navzájem propojeny. Všimněte si, že na každém konci přenosové linky jsou spojeny piny RxD a TxD, což mj. znamená, že vysílač současně čte data, která sám vysílá (a může tato data ihned zahodit, resp. je ignorovat nebo použít pro základní test funkčnosti čipu UART). Použití pouhých dvou vodičů při přenosu je umožněno tím, že vždy jedna strana vystupuje jako vysílač a druhá strana jako přijímač, přičemž na prohození obou rolí (přijímač se stane vysílačem a naopak vysílač se stane přijímačem) se musí obě komunikující strany dohodnout pomocí nějakého (i když mnohdy značně primitivního) protokolu.

pc4103

Obrázek 3: Způsob propojení dvou zařízení přes sériový port při použití poloduplexního přenosu dat se softwarovým řízením.

V současnosti se ve většině případů používá plně duplexní přenos, při kterém jsou obě zařízení propojena dvěma signálovými vodiči zapojenými do kříže – viz schéma zobrazené na čtvrtém obrázku. Na první pohled by se mohlo zdát, že v tomto případě není vůbec zapotřebí přenos dat nějakým způsobem řídit, ale ve skutečnosti je nutné zajistit, aby spolu bez ztráty informací mohly komunikovat i ta zařízení, která data zpracovávají rozdílnou rychlostí. Příkladem mohou být modemy, které s počítačem komunikují větší rychlostí, než je rychlost vysílání a příjmu dat na druhé straně modemu (například komutované telefonní linky); důvod, proč tomu tak je, jsme si vysvětlili v předchozí části tohoto seriálu. V případě, že modem již nestíhá data dodávaná počítačem zpracovávat (jeho vyrovnávací paměť je – co se týče kapacity – značně omezena), může v případě softwarového řízení přenosu zpět do počítače vyslat ASCII znak s kódem 19, který je také známý svým označením DC3 (device control 3) nebo také X-OFF. Počítač tento znak přijme a ihned poté přestane odesílat další data. Ve chvíli, kdy je modem (či jiné zařízení) opět připraveno data přijímat, vyšle po sériové lince ASCII znak s kódem 17 (DC1 nebo též X-ON).

pc4104

Obrázek 4: Způsob propojení dvou zařízení přes sériový port při použití plně duplexního přenosu dat (full dupplex).

Tento způsob řízení přenosu dat není pouze doménou sériového portu, ale používá se například i pro „zastavení“ terminálu připojeného k počítači pomocí jiných komunikačních kanálů (Ethernet, proudová smyčka atd.). I v mnohých emulátorech terminálů (rxvt) je možné tyto znaky použít pro zastavení a následné povolení výpisu. Potřebné znaky s kódy 17 a 19 se generují stlačením kláves CTRL+S a CTRL+Q.

3. Hardwarové řízení pomocí signálů RTS/CTS

Kromě softwarově řízené komunikace, při níž se většinou používají výše zmíněné ASCII kódy DC1, X-ON a DC3, X-OFF je možné, například při komunikaci mezi počítačem a rychlým modemem nebo při přenosu dat mezi dvěma počítači, použít i takzvané hardwarové řízení přenosu. Ve své podstatě se nejedná o nic jiného než o jednu z forem handshakingu, který je použit mj. i u dříve popsaného paralelního portu. V případě portu sériového však není zapotřebí potvrzovat příjem každého bitu, jelikož tato činnost je zajištěna samotným čipem UARTu; zařízení (či naopak počítač) pomocí signálů dává najevo, že již nemůže přijmout další bajt (znak). V praxi se ustálily dva způsoby hardwarového řízení. První způsob využívá pinů RTS a CTS, druhý způsob pak pinů DTR a DSR. Původní význam těchto pinů je vypsán v následující tabulce:

Pin Původní název Původní význam
DCD Data Carrier Detect Detekce nosné. Modem oznamuje terminálu, že na telefonní lince detekoval nosný kmitočet
DTR Data Terminal Ready Terminál tímto signálem oznamuje modemu, že je připraven komunikovat
DSR Data Set Ready Modem tímto signálem oznamuje terminálu, že je připraven komunikovat
RTS Request to Send Terminál tímto signálem oznamuje modemu, že komunikační cesta je volná
CTS Clear to Send Modem tímto signálem oznamuje terminálu, že komunikační cesta je volná
RI Ring Indicator Indikátor zvonění. Modem oznamuje terminálu, že na telefonní lince detekoval signál zvonění

Při hardwarovém řízení známém také pod označením RTS/CTS (toto označení najdeme v konfiguraci mnoha programů), jsou potvrzovací signály posílané mezi dvojicí pinů RTS a CTS. Řízení však musí být v případě plně duplexního přenosu dat prováděno obousměrně, proto se používá způsob zapojení zobrazený na pátém obrázku. Všimněte si, že piny RTS a CTS jsou zapojeny do kříže, přičemž pin RTS je výstupní a pin CTS naopak vstupní.

pc4105

Obrázek 5: Způsob propojení dvou zařízení přes sériový port při použití přenosu dat řízeného signály RTS a CTS.

4. Hardwarové řízení pomocí signálů DTR/DSR

Komunikaci je možné řídit také pomocí signálů vysílaných mezi piny DTR a DSR. Tento způsob řízení přenosu je prakticky zcela totožný se způsobem popsaným v předchozí kapitole, pouze se (převážně z historických a dnes již překonaných důvodů) používá jiná dvojice pinů. V praxi tedy pro zajištění vzájemné kompatibility všechny komunikační programy podporují oba způsoby hardwarového řízení a i propojovací kabely obsahují oba zmiňované způsoby komunikace. Musíme si však dát pozor na to, aby obě komunikující zařízení používala stejný způsob řízení dat, jinak bymohlo dojít ke ztrátě posílaných znaků v případě, že by jedno ze zařízení nestačilo posílaná data načítat a zpracovávat! Některé komunikační programy, například v minulosti známý Laplink obsahovaly detekční rutinu, pomocí níž zjistily, který způsob řízení je možné použít. Toto řešení však funguje pouze v případě, kdy obě komunikující strany dodržují předem dohodnutý protokol vyšší úrovně.

pc4106

Obrázek 6: Způsob propojení dvou zařízení přes sériový port při použití přenosu dat řízeného signály DTR a DSR.

5. Podpora sériové komunikace v operačních systémech

V případě, že zařízení připojené k sériovému portu komunikuje standardním způsobem, tj. pro posílání a příjem dat se používá předminule popsaný asynchronní způsob přenosu po pinech TxD a RxD a řízení toku dat je prováděno buď softwarově (X-ON, X-OFF) nebo hardwarově (RTS/CTS, DTR/DSR), není většinou nutné vytvářet vlastní ovladač, který by sériový port přímo řídil pomocí jeho konfiguračních registrů. Místo toho se lze na sériový port dívat jako na běžné znakové zařízení, na které je možné vysílat jednotlivé znaky (bajty) a naopak číst znaky (bajty), které byly sériovým portem přijaty. V případě Unixových systémů se parametry komunikace nastavují pomocí minule zmíněné utility setserial, samotný sériový port je většinou dostupný jako zařízení /dev/ttySx (dříve také /dev/ttyx, za x je nutné dosadit číslo 0 až počet portů-1), viz následující tabulka mapování mezi DOSovým způsobem označování a způsobem Unixovým:

dos     common                 IO
name     name     major minor address
COM1   /dev/ttyS0  4,  64;   3F8
COM2   /dev/ttyS1  4,  65;   2F8
COM3   /dev/ttyS2  4,  66;   3E8
COM4   /dev/ttyS3  4,  67;   2E8 

V operačním systému MS-DOS (a systémech s ním kompatibilních, včetně většiny verzí MS Windows) se pro nastavení sériové linky používá příkaz mode. Pomocí tohoto příkazu je možné změnit přenosovou rychlost, způsob generování paritního bitu, počet datových bitů (5–8), délku stop bitu (1, 1,5, 2) a v neposlední řadě také to, jaký způsob řízení přenosu dat bude použit (viz předchozí kapitoly, kde se tímto tématem podrobněji zabýváme). Kromě toho je také možné přesměrovat původní výstupy na tiskárnu, tj. některé zařízení LPTx, na sériový port, tj. zařízení COMx. Teoreticky je tedy možné, aby DOSové programy, které by běžně prováděly tisk na lokální tiskárnu připojenou pomocí paralelního portu, ve skutečnosti přenášely data po sériové lince (a případných modemech) na vzdálenou tiskárnu. Ve skutečnosti většina DOSových programů tiskárnu ovládala přímo, čemuž se – vzhledem k „podpoře“ tiskáren v tomto operačním systému – nelze ani divit, takže přesměrování na tyto programy nemělo žádný vliv.

Po nastavení parametrů sériového portu pomocí výše zmíněného příkazu mode je možné používat zařízení COMx (například COM1) jak pro výstup dat, tak i pro jejich vstup. Pokud je například na druhé straně sériové linky připojený terminál a jsou správně nastaveny všechny parametry komunikace, lze na vzdálený terminál psát znaky i bez komunikačního programu, například takto:

copy con com1 

Komunikace se ukončí zadáním znaku pro konec souboru, což je v případě MS-DOSu ASCII poněkud nestandardně znak CTRL+Z, nikoli – jak asi očekáváte – standardní znak CTRL+D (EOT – End Of Transfer).

6. Literatura a odkazy na Internetu

skoleni

7. Obsah další části seriálu

V následující části seriálu o architekturách počítačů se budeme zabývat popisem rozhraní MIDI a také dnes velmi populární universální sériovou sběrnicí (USB). Přes standardizované rozhraní MIDI je možné k počítači připojit prakticky jakékoli hudební zařízení vybavené taktéž tímto rozhraním; na fyzické úrovni se jedná o jednu z variant sériového přenosu dat. V případě USB se jedná o externí sběrnici (přesněji řečeno jde o sběrnici na logické úrovni řízení, na fyzické úrovni jsou jednotlivá spolu komunikující zařízení propojena systémem point to point), která byla navržena s ohledem na co nejsnazší připojení externích zařízení k počítači. Sběrnice USB postupně vytlačila prakticky všechny starší technologie sloužící k připojení externích zařízení – například port pro klávesnici a myš (původně se na IBM PC jednalo o konektor DIN, později PS/2), sériové (RS-232C) a paralelní porty atd. Jedinou výjimkou jsou vysokorychlostní externí zařízení, pro které se dnes používá převážně rozhraní FireWire a SCSI.

pc4107

Obrázek 7: Vzhledem k tomu, že sběrnice USB obsahuje i napájecí vodiče s poměrně velkým příkonem, objevují se v obchodech různá „silová“ zařízení, jakým je například tento přihřívač kávy.

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.