You are on page 1of 9

Počítače a jejich periférie – pc.

4 1

4 Komunikace pomocí sériového rozhraní RS232C


Pro pochopení základních principů komunikace počítače s periferním zařízením
vytvoříme jednoduchý program, který bude komunikovat prostřednictvím sériového
asynchronního rozhraní RS232C. Toto rozhraní je doposud implementováno v běžných
počítačích typu PC a poskytované prostředky tohoto rozhraní umožňují jeho snadné
programování.

4.1 Popis způsobu komunikace

Jako periférie nebude zvoleno specifické zařízení, ale druhý osobní počítač. Toto
umožní snadnou obsluhu komunikace oběma směry bez nutnosti komplikovaného
programování mikroprocesoru specifického periferního zařízení.
Dále popisovaný program bude schopen přenášet znaky ze standardního vstupu
místního počítače na standardní výstup vzdáleného počítače a obráceně. Takže znaky
natypované na klávesnici místního počítače jsou automaticky přeneseny na obrazovku
vzdáleného počítače a obráceně.
Do vysílacího okna „Sended data string:“ budou zobrazovány znaky natypované na
místním počítači, zároveň jsou to také znaky, které jsou automaticky odesílány na sériové
rozhraní. V přijímacím okně „Received data string:“ budou zobrazovány příchozí znaky ze
vzdáleného počítače (znaky přijaté skrze sériové rozhraní). Základní datovou jednotkou bude
1 byte, který bude představovat ASCII kód zmáčknuté klávesy. Datové jednotky se budou
odesílat okamžitě po jejich natypování. Ke komunikaci bude použit sériový port COM1 a
počítače musí být propojeny datovým kabelem Canon 9F/9F.
Zjednodušeně se dá algoritmus programu rozdělit na dvě základní smyčky:
• Obsluha zobrazení znaků natypovaných na místním počítači – budou obslouženy
všechny znakové klávesy, specificky bude obsloužena klávesa ESC (zobrazení
dotazu na ukončení programu), Enter (odřádkování psaných znaků), Backspace
(mazání již napsaných znaků). Pokud bude počet natypovaných řádků delší než
počet zobrazitelných řádků, text začne rolovat nahoru.
• Obsluha zobrazení znaků natypovaných na vzdáleném počítači – obsluha
jednotlivých jevů je zcela identická s tím rozdílem, že nebude ošetřena klávesa ESC
pro zobrazení dotazu na ukončení.

4.2 Popis hlavní části programu

Součástí hlavní smyčky bude testování výskytu znaku v zásobníku standardního vstupu
(byla-li smáčknuta klávesa na místním počítači) a testování výskytu znaku v adresovém
prostoru sériového rozhraní (byl-li přijat znak ze vzdáleného počítače). Bezprostředně po
obsluze natypovaného znaku na standardním výstupu místního počítače bude tento znak vždy
odeslán na sériové rozhraní.
Zdrojový kód v prezentované podobě nebude zcela optimální. Optimalizace zdrojového
kódu většinou způsobí snížení jeho čitelnosti. Z tohoto důvodu bude obsluha znaků

Ing. Miroslav Balík. Ph.D.


2 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

natypovaných na místním počítači zcela oddělena od obsluhy znaků natypovaných na


vzdáleném počítači, i když jsou si velmi podobné.
V hlavní části programu bude realizováno pouze hlavní větvení stromu vývojového
diagramu. Všechny ostatní operace budou realizovány prostřednictvím podprogramů.

inicializace inicializace
START seriového uživatelského
rozhraní rozhraní

odeslání
dat
-
zmáčknuta - přijata
klávesa? data?

+ +

načtení přijetí p.o. - přijímací okno


klávesy dat v.o. - vysílací okno

+ smaž
esc?
+ backspace? znak
p.o.
- -

smaž + + odřádkuj
znak backspace? enter?
p.o.
v.o.
- -

+ zobraz
odřádkuj
enter? znak
v.o.
p.o.
-

zobraz dotaz
znak na KONEC
v.o. ukončení

Obrázek 4.1: Vývojový diagram hlavní části programu

4.3 Zkrácený popis podprogramů

• Inicializace sériového rozhraní – nastaví všechny parametry asynchronního


sériového rozhraní RS232C a povolí vlastní komunikaci.
• Inicializace uživatelského rozhraní – vykreslí na obrazovku grafické/textové
rozhraní aplikace v požadovaném režimu, nastaví výchozí polohu kursoru.

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.4 3

• Smaž znak – v daném okně provede smazání posledního znaku a posune kursor
zpět, dodržuje velikost plochy pro zobrazování textu.
• Odřádkuj – v daném okně provede změnu polohy kursoru na začátek dalšího
řádku, dodržuje velikost plochy pro zobrazování textu.
• Zobraz znak – v daném okně zobrazí znak na aktuální poloze kursoru a následně
posune kursor za znak, dodržuje velikost plochy pro zobrazování textu.
• Odeslání dat – zajistí odeslání připraveného znaku na sériové rozhraní.
• Dotaz na ukončení – zobrazí dialog dotazu na ukončení z volbou y/n. Dále čeká na
smáčknutí klávesy “y“ nebo “n“. V případě “y“ je program korektně ukončen,
v případě “n“ dojde ke smazání dialogu dotazu a následuje návrat na začátek hlavní
smyčky programu.

5 Asynchronní sériové rozhraní


V programu pro komunikaci mezi dvěma počítači PC pomocí sériového rozhraní
RS232C je nutné pracovat se vstupně – výstupním adresovým prostorem. Tento program
pracuje s asynchronním sériovým rozhraním.

5.1 Adresování vstupu a výstupu

Vstupně – výstupní adresový prostor je u procesorů x86 kompatibilních v rozsahu adres


0000h až FFFFh. V běžných počítačích typu PC je využitelná pouze část tohoto adresového
prostoru v rozsahu 000h až 3FFh. Konkrétní obsazení tohoto adresového prostoru je v
následující tabulce:
Tabulka 5.1: Obsazení vstupně - výstupního prostoru PC AT

Počáteční adresa Koncová adresa V/V zařízení - adaptér


000h 01Fh 1. řadič DMA – 8237
020h 03Fh 1. řadič přerušení – 8259A
040h 05Fh časovač 8254
060h 06Fh adaptér klávesnice 8042
070h 07Fh reálné hodiny, blokování NMI
080h 09Fh stránkové registry DMA
0A0h 0BFh 2. řadič přerušení 8259A
0C0h 0DFh 2. řadič DMA
0F0h 0FFh numerický koprocesor
1F0h 1F8h adaptér disku Winchester
200h 207h adaptér pro hry
278h 27Fh 2. tiskárna
2F8h 2FFh 2. adaptér asynchronní komunikace
300h 31Fh prototypová deska
360h 36Fh rezerva
378h 37Fh 1. tiskárna
380h 38Fh synchronní komunikace SDLC

Ing. Miroslav Balík. Ph.D.


4 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

3A0h 3AFh synchronní komunikace BSC


3B0h 3BFh monochromatický adaptér + tiskárna
3C0h 3CFh rezerva
3D0h 3DFh barevný adaptér
3F0h 3F7h adaptér diskety
3F8h 3FFh 1. adaptér asynchronní komunikace

Pro realizaci vstupně- výstupních operací se používají instrukce:


• in – instrukce vstupu z v/v adresového prostoru – nejdříve se do registru dx
přesune adresa (instrukcí mov) z V/V adresovatelného prostoru, ze které má
dojít k načtení hodnoty. Instrukce in pak hodnotu z adresy dx přenese do
požadovaného registru (např. al, ax).
• out – instrukce výstupu do v/v adresového prostoru – nejdříve se do registru dx
přesune adresa (instrukcí mov) z V/V adresovatelného prostoru, na kterou má
být vyslána hodnota. Instrukce out pak hodnotu z registru (např. al, ax) vyšle na
adresu v dx.

5.2 Sériové rozhraní RS232C

Jedná se o asynchronní sériové rozhraní, které je v počítači PC implementováno


s těmito základními vlastnostmi:
• Je přímo programovatelné pomocí vstupně - výstupních instrukcí (in, out).
• Jádrem je integrovaný komunikační adapter 8250 (v současné době jako součást
jižního mostu čipové sady).
• Standardně jsou implementována dvě rozhraní RS232C s možností dalšího
rozšíření:
‰ COM1 - 1. adaptér asynchronní komunikace
ƒ bázová adresa 3F8 (vybírá adaptér)
ƒ žádost o přerušení IRQ4
ƒ bázová adresa je ve slově 0:400
‰ COM2 - 2. adaptér asynchronní komunikace
ƒ 2F8, IRQ3, 0:402
‰ možnost rozšíření COM3, COM4 - 0:403, 0:404
• Nejdůležitějšími signály rozhraní jsou signály TD a RD, všechny signály jsou na
úrovních TTL, budič (+3 ~ +15)V/(-3 ~ -15)V, popis všech signálů je v následující
tabulce:

Tabulka 5.2: Signály sériového rozhraní v konektoru Cannon s 9/25 vývody

Signál Směr Vývod 9/25 Funkce


FG - 5/1 Chassis – zem

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.4 5

TD z PC 3/2 Transmit Data - výstup dat v ser. tvaru


RD do PC 2/3 Recieve Data - vstup dat v ser. tvaru
RTS z PC 7/4 Request To Send - požadavek vysílání
CTS do PC 8/5 Clear To Send - připravenost k vysílání
DSR do PC 6/6 Data Send Ready -periferie připravena
SG - 5/7 Signálová zem
DCD do PC 1/8 Data Carrier Datec - signál v rozmezí
+12V - -/9 Výstup +12V (max. 0,5A)
-12V - -/10 Výstup -12V (max. 0,5A)
DTR z PC 4/20 Data Terminal Ready - adaptér je
připraven
RI do PC 9/22 Ring Indicator - hlášení o přijmu

a) b)

FG 1 1 1 1
SG 7 7 7 7
TD 2 2 2 2
RD 3 3 3 3
RTS 4 4 4 4
CTS 5 5 5 5
DSR 6 6 6 6
DTR 20 20 20 20
DCD 8 8 8 8
TC 15 15 15 15
RC 17 17 17 17

Obrázek 5.1: Zapojení nulového modemu v režimu a) duplexním b) poloduplexním

• Formát dat je dán rámcem s těmito parametry:


ƒ jeden start bit
ƒ 5 až 8 datových bitů (nositelé informace), bit LSB je první v pořadí
ƒ žádný nebo jeden paritní bit
ƒ jeden nebo dva stop bity

S 0 1 . . . . . n P Stop

n informačních bitů
Startovací bit
Paritní bit
Stop bity

Obrázek 5.2: Možný tvar datového rámce jedné položky

Ing. Miroslav Balík. Ph.D.


6 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

5.3 Programování asynchronního sériového rozhraní

Programování je zprostředkováno pomocí dvanácti 8-i bitových „registrů“. Registrem


se v tomto případě nazývají adresy ve vstupně-výstupním adresovém prostoru, kdy hodnoty
na těchto adresách mají specifický význam. Registry pro COM1 odpovídají adrese 3XXh a
registry pro COM2 odpovídají adrese 2XXh.

• Vysílací a přijímací registr (3F8h,2F8h)


• Registr povolení přerušení (3F9h, 2F9h)
• Registr identifikace přerušení (3FAh, 2FAh)
• Registr řízení linky (3FBh, 2FBh)
• Registr řízení modemu (3FCh, 2FCh)
• Registr stavu linky (3FDh, 2FDh)
• Registr stavu modemu (3FEh, 2FEh)

Následuje popis registrů pro rozhraní COM1, rozhraní COM2 má význam registrů
stejný, jen jsou registry na adresách o 100h nižších. Hodnoty D0~D7 vždy představují
jednotlivé bity v aktuálním registru.

3F8h Zápis: Vysílací registr 8 bitů znaku k odvysílání (když DLAB=0)


Zápis: Dolní byte dělitele (když DLAB=1)
Čtení: Přijímací registr 8 bitů přijatého znaku
Po instrukci out _ 3FBh,80h (nastaví DLAB na 1) tento registr představuje
dolní byte dělitele hodin, který společně s horním bytem (na adrese 3F9h)
tvoří 16-bitovou hodnotu, která určuje přenosovou rychlost podle tabulky:
dělitel: 1041 768 384 192 96 48 24 12
přen. rychlost [bps]: 110 150 300 600 1200 2400 4800 9600
3F9h Zápis: Horní byte dělitele (když DLAB=1)
Zápis: Registr povolení přerušení
D0: 1 - povolí přerušení od přijatého znaku
D1: 1 - povolí přerušení po odvysílání znaku
D2: 1 - povolí přerušení od stavu přijímací linky (error nebo break)
D3: 1 - povolí přerušení od stavu modemu (CTS, DSR, RI, RLSD)
Čtení: Registr identifikace přerušení.
3FAh
Po příchodu přerušení je možné číst tento registr, čímž se zjistí, co přerušení
způsobilo.
D0: 1 - žádné otevřené přerušení (lze použít pro polling)
D1~D2: 00 - stavové přerušení od přijímací linky.
Výskyt: overrun, parity, framing error, break. Resetuje se
čtením statusu 3FDh.
01 - přijatá data k dispozici
Resetuje se čtením přijímacího bufferu 3F8h
10 - registr vysílače vyprázdněn

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.4 7

Resetuje se zápisem do zásobníku vysílače 3f8h


11 - status modemu
Výskyt:Clear To Send, Data Set Ready, Ring Ind, nebo Detekce
signálu přijímací linky. Resetuje se čtením stavu 3FEh
D3~D7: nemají význam
3FBh Čtení/Zápis: registr řízení linky
D0~D1: délka slova: 00 - 5, 01 - 6, 10 - 7, 11 - 8
D2: stop bity: 0 - 1, 1 - 2
D3~D4: parita: X0 - nic, 01 - Lichá, 11 - Sudá
D5: zaseklá parita (nepoužito BIOSem)
D6: povolení kontroly break. 1 - začne vysílat nulu
D7: DLAB (Divisor Latch Access Bit) - přístup do registru dělitele na
portech 3F8h a 3F9h. 1- nastav přenosovou rychlost, 0 - normální stav
3FCh Zápis: Registr řízení modemu
D0: 1 - aktivace -DTR (data terminal ready), 0 - deaktivace
D1: 1 - aktivace -RTS (request to send), 0 - deaktivace
D2: 1 - aktivace -OUT1 (uživatelský výstup)
D3: 1 - aktivace -OUT2
D4: 1 - aktivace zpětné vazby pro diagnostické účely
3FDh Čtení: Registr stavu linky
Pozn. D1~D4 způsobují přerušení, je-li povoleno (3F9h).
D0: 1 - data ready (DR), resetuje se čtením přijatého znaku
D1: 1 - overrun error (OE), předchozí znak je ztracen
D2: 1 - parity error (PE), resetuje se čtením statusu linky
D3: 1 - framing error (FE), špatný stop bit ve znaku
D4: 1 - break indicated (BI), přijata trvalá nula.
D5: 1 - vyprázdnění registru vysílače, může se vysílat
D6: 1 - vysílač je prázdný, žádná data nejsou zpracovávána
D7: není použit
3FEh Čtení: Registr stavu modemu
Pozn. D0~D3 způsobují přerušení, je-li povoleno (3F9h).
D0: 1 - Delta Clear To Send (DCTS) - CTS změnil stav
D1: 1 - Delta Data Set Ready (DDSR) - DSR změnil stav
D2: 1 - Trailing Edge Ring Indicator (TERI), vzestupná hrana
indikátoru vyzvánění
D3: 1 - Delta Data Carrier Detect (DDCD) - DCD změnil stav
D4: 1 - Clear To Send (CTS) je aktivní
D5: 1 - Data Set Ready (DSR) je aktivní
D6: 1 - Ring Indicator (RI) je aktivní
D7: 1 - Data Carrier Detect (DCD) je aktivní

5.4 Inicializace asynchronního rozhraní

Inicializace rozhraní se provádí na začátku hlavní části programu. Před ukončením běhu
programu není nutné parametry nastavené v rámci inicializace uvádět do původních hodnot.
Během inicializace je nutné nastavit tyto parametry komunikace:

Ing. Miroslav Balík. Ph.D.


8 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

• výběr sériového portu – je dán používáním rozsahu adres, pro práci s COM1 se
použijí adresy 3XXh.
• nastavení rychlosti komunikace – provede se nastavením registrů 3F8h a 3F9h, do
registru 3F8h se uloží dolní byte dělitele, do 3F9h horní byte dělitele, před
nastavením je nutné uvést rozhraní do stavu nastavování rychlosti (DLAB = 1),
komunikace bude probíhat rychlostí 1200bps (dělitel 96).
• nastavení parametrů datového rámce – provede se nastavením registru 3FBh,
počet datových bitů 8, 1 stop bit a žádný paritní bit.
• přechod do stavu aktivní komunikace – registr 3F8h se nastaví jako
vstupně/výstupní registr komunikace, provede se nastavením DLAB = 0 v registru
3FBh.

Zdrojový kód inicializace asynchronního rozhraní (COM1):

mov _ al,80h ; v al je 10000000b


mov _ dx,3FBh ; bude použit registr 3FBh
out _ dx,al ; DLAB nastaven na 1
mov _ al,96 ; v al dolní byte dělitele (96d)
mov _ dx,3F8h ; bude použit registr 3F8h
out _ dx,al ; nastaven dolní byte dělitele
mov _ al,0 ; v al horní byte dělitele (0)
mov _ dx,3F9h ; bude použit registr 3F9h
out _ dx,al ; nastaven horní byte dělitele
mov _ al,00000011b ; přednastavení bitů pro požadovaný formát
datového rámce
mov _ dx,3FBh ; bude použit registr 3FBh
out _ dx,al ; nastaveno 8 datových bitů, 1 stop bit, žádna
parita, DLAB = 0 – rozhraní je připravené
pro komunikaci

5.5 Vyslání dat na asynchronního rozhraní

Vyslání dat druhé straně je možné realizovat několika způsoby, které se liší množstvím
ověřovaných parametrů. Např. je možné ověřovat, zda byl vyslaný znak vůbec přijat na druhé
straně, zda byl přijat bez chyb nebo je možné ověřit, zda během komunikace nedošlo
k rozpojení kabelu apod. Tyto možnosti dává k dispozici registr stavu linky 3FDh.
Následující způsob vyslání dat je ten nejjednodušší možný, nekontroluje žádný z výše
uvedených parametrů, pouze ověřuje, zda byla vyslána z výstupního registru. Má dvě fáze:
• vyslání dat z datového registru do vstupně-výstupního registru rozhraní – byte
připravený v registru al je vyslán do registru 3F8h.
• čekání, dokud data neopustí vstupně-výstupní registr – dochází k testování bitu
D5 v registru stavu linky 3FDh. Dokud není tento bit nastaven na 1, data nebyla
odeslána ze vstupně-výstupního registru 3F8h.

Zdrojový kód vyslání dat na asynchronní rozhraní (COM1):

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.4 9

; v al je připraven byte pro odeslání


mov _ dx,3F8h ; bude použit registr 3F8h
out _ dx,al ; data z al odeslána na vstupně/výstupní
registr rozhraní
wa: mov _ dx,3FDh ; bude použit registr 3FDh
in _ al,dx ; do al přenesen obsah registru stavu linky
3FDh
and _ al,00100000b ; logický součin – maskování bitu D5
cmp _ al,0 ; podmínka – je D5 roven 0?
je _ wa ; pokud je, data nebyla odeslána, opakuj
testování D5

5.6 Příjem dat z asynchronního rozhraní

Příjem dat z asynchronního rozhraní je jev, který musí být programem vhodným
způsobem ošetřen. V hlavní části programu dochází kromě testování standardního vstupu také
k testování výskytu nových dat ve vstupně-výstupním registru asynchronního rozhraní. Tedy
k samotnému příjmu dat z asynchronního rozhraní dochází pouze tehdy, pokud jsou data
přítomna ve vstupně-výstupním registru 3F8h. V jiném případě program pouze obsluhuje
standardní vstup (klávesnici).
Příjem dat z asynchronního rozhraní má dvě fáze:
• Testování výskytu přijatých dat – dochází k testování bitu D0 v registru stavu
linky. Pokud je bit nastaven na 1, ve vstupně-výstupním registru jsou připravena
přijatá data.
• Načtení dat – data ze vstupně-výstupním registru 3F8h jsou přenesena do registru
al.

Zdrojový kód příjmu dat z asynchronního rozhraní (COM1):

mov _ dx,3FDh ; bude použit registr 3FDh


in _ al, dx ; do al přenesen obsah registru stavu linky
and _ al,00000001b ; logický součin – maskování bitu D0
cmp _ al,0 ; podmínka – je D0 roven 0?
je _ dal ; pokud je, nejsou připravena přijatá data,
pokračuj instrukcemi na návěští dal:
mov _ dx,3F8h ; bude použit registr 3F8h
in _ al,dx ; data ze vstupně/výstupního registru rozhraní
přenesena do registru al
dal: … ; následující instrukce

Ing. Miroslav Balík. Ph.D.

You might also like