Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, že není dovoleno tuto ukázku jakýmkoliv zpùsobem dále šíøit, veøejnì èi neveøejnì napø. umis ováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura redakce@ben.cz
2 SÉRIOVÝ PORT COM Døíve než se pustíme do vlastního objasòování, jak napsat program pro obsluhu sériového portu, bude nutné si nejdøíve vyèerpávajícím zpùsobem popsat jeho hardwarové vlastnosti Vlastní obvod pro sériovou komunikaci tvoøí zpravidla obvod UART 8250, a to u starších typù poèítaèù, nebo obvod 82550 u novìjších typù Jádro tohoto obvodu pro sériovou komunikaci mùže být obsaženo i v jiných èipech, které jsou použity pro øešení hardwaru paralelních i sériových portù najednou Hovoøíme-li však o sériovém rozhraní COM, musí tyto definované vlastnosti obvod realizující sériové rozhraní obsahovat 2 1 Popis hardwaru sériového portu Signály na rozhraní sériového portu mùžeme rozdìlit z hlediska své funkce do dvou skupin První skupinu tvoøí signály pro vlastní sériový pøenos dat, a to signál pro vysílání dat (TxD) a signál pro pøíjem dat (RxD) Druhou skupinou jsou tzv signály modemu sériového rozhraní Tyto signály pøenášejí informaci o stavu vysílaèe a pøijímaèe sériových dat Pøenáší informace pøi navazování spojení a zároveò se používají pro øízení vlastního pøenosu dat Jsou to signály (RTS, CTS, DSR, DTR) Zvláštním signálem je signál DCD, který pøenáší informaci o navázání Obr 2 1 A 2 SÉRIOVÝ PORT COM 9
spojení Zapojení 9pinového konektoru CANNON sériového portu je vyobrazeno na obr 2 1 Vlastní princip sériové komunikace si popíšeme v následující kapitole 2 2 Princip sériové komunikace Pøi vysílání znaku jsou data nahrána z registru Transmiter Holding Register do posuvného registru vysílaèe a bit po bitu posílána na výstup jako signál TxD Struktura pøenášeného byte je znázornìna na obr 2 2 UiPHFSURE\WH '$7$%<7( '$7$%<7( 67$57%,7 3$5,7<%,7 67236%,76 Obr 2 2 Struktura pøenášeného byte Jak je z obr 2 1 zøejmé, kromì datové informace, která mùže mít rùznou délku, jsou s každým znakem vysílány i informace synchronizaèní, protože jde o tzv asynchronní pøenos dat Každý rámec oznámí svùj zaèátek pøijímaèi nízkou úrovní L signálu TxD Toto se nazývá START BIT Po uplynutí start bitu následují bity datové Poèet tìchto bitù se mùže pohybovat od 5 do 8 Po odvysílání datových bitù mùže (ale nemusí) následovat tzv paritní bit, který slouží pro kontrolu chyb sériového pøenosu Posledními vysílanými bity jednoho rámce jsou STOP BITY, které rámec ukonèují Poèet tìchto stop bitù mùže být jeden, jeden a pùl nebo dva Stop bit má proti start bitu vysokou úroveò H Jakmile se tato vysoká úroveò zmìní v nízkou, považuje to pøijímaè za start bit dalšího rámce Pøijímaè pøi sériové komunikaci oèekává pøijímané bity jako signál RxD a ve svém posuvném registru z nich skládá pøijatý znak Nìkteré obvody UART vzorkují vstup RxD ètyønásobnou rychlostí a provádìjí vyhodnocení odebraných vzorkù na principu pravdìpodobnosti dva ze tøí Tím jsou eliminovány krátké poruchy nebo rušení v pøenosu dat Pøijatý signál RxD je ukládán do posuvného registru a postupnì je z nìho skládán pøijatý znak Ten po pøijetí jeho posledního bitu uloží rámec do registru Receiver Buffer Register, ze kterého je poté odebrán k dalšímu zpracování 10 VÁCLAV VACEK SÉRIOVÁ KOMUNIKACE VE WIN 32 A
Poèet datových bitù, pøítomnost paritního bitu, typ parity, poèet stop bitù a rychlost pøenosu dat, tedy dobu existence 1 bitu na pøenosové lince lze nakonfigurovat a jak se to udìlá, si vysvìtlíme pøi vlastním objasòování tvorby programu obsluhy sériového portu 2 3 Signály modemu sériového portu Jak již bylo výše øeèeno, signály modemu se používají pøi navazování spojení i pøi vlastním datovém pøenosu U vlastní asynchronní sériové komunikace není nezbytnì nutné tyto signály využívat, ale nìkteré aplikace èi hardwarové periferie používání tìchto signálù vyžadují Mezi tato zaøízení patøí i telefonní datový modem Signály modemu sériového portu tvoøí vždy dvojice pro daný typ aktivity Signály '75 a '65 se používají k navázání spojení, zatímco signály 576 a &76 se používají pro øízení vlastního pøenosu dat: '75 data terminal ready PC modem PC je svolné k pøipojení, deaktivace tohoto signálu pøeruší spojení '65 data set ready modem PC modem je pøipraven spojit se s PC 576 request to send PC modem PC je pøipraveno vysílat &76 clear to send modem PC modem je pøipraven pøijmout další data '&' data carrier detect modem PC modem zachytil nosnou vysílanou PC 5, ring indicator modem PC nìkdo volá a chce se spojit Pøi navazování spojení jsou využívány signály '65 a '75 Svou pøipravenost spojit se s PC dává modem najevo signálem '65 Svou pøipravenost pøipojení k modemu dává PC modemu najevo signálem '75 Datový telefonní modem pøi deaktivaci signálu '75 zpravidla pøeruší spojení, ale tuto funkci je možné u nìkterých typù modemu zablokovat Svou pøipravenost k vysílání dává PC modemu najevo signálem 576 To že je modem pøipraven pøijmout data z PC dává modem najevo signálem &76 Není-li tento signál aktivní, nesmí PC odesílat do modemu žádná data, jelikož by došlo k jejich ztrátì Signálem '&' dává modem PC najevo, že bylo navázáno spojení, a že je možné zapoèít datovou komunikaci Nastal-li pøípad, že navázané spojení mezi modemy bylo pøerušeno, signál '&' pøestane být aktivní a spojení je nutné navázat znovu A 2 SÉRIOVÝ PORT COM 11
Posledním signálem RI modem dává PC najevo, že nìkdo požaduje spojení Jde o tzv indikaci vyzvánìní Na závìr je ještì nutné podotknout, že u signálu modemu platí, že jsou aktivní pøi nízké úrovni L, a proto jsou v textu oznaèeny jako negované Tímto jsme uzavøeli kapitolu popisu sériového portu COM, a to z hlediska významu a funkce jednotlivých signálù, a jako další bude nutné popsat vybrané procedury a datové struktury používané pøi programování obsluhy sériového portu 12 VÁCLAV VACEK SÉRIOVÁ KOMUNIKACE VE WIN 32 A
6 POPIS PROSTØEDKÙ TAPI TELEFONNÍHO MODEMU Seznam vybraných funkcí TAPI pro obsluhu telefonního modemu: DEVICECONFIG 82 MODEM_INFO 83 linecallbackfunc 84 LINECALLINFO 85 LINECALLPARAMS 88 lineclose 90 LINEDEVCAPS 91 linedeallocatecall 93 linedrop 94 linegetcallinfo 95 linegetdevcaps 96 linegetdevconfig 97 linegetid 98 lineinitialize 99 linemakecall 100 linenegotiateapiversion 101 lineopen 102 linesetdevconfig 104 lineshutdown 105 A 6 POPIS PROSTØEDKÙ TAPI TELEFONNÍHO MODEMU 79
DEVICECONFIG Kategorie: Struktura Definice: typedef struct device_config_tag { VARSTRING vs; DWORD dwsize; DWORD dwversion; WORD fwoptions; WORD wwaitbong; COMMCONFIG commconfig; } DEVICECONFIG, FAR *LPDEVICECONFIG; Popis: Struktura komplexnì popisující nastavení komunikaèního rozhraní místního modemu Je použita pøi volání funkcí linegetdevconfig a linesetdevconfig pøi zjiš ování a nastavování parametrù sériového portu místního modemu V parametru tìchto funkcí je pøetypována na promìnný øetìzec typu VARSTRING Parametry: vs Promìnná typu VARSTRING obsahující popis konstrukce a velikost dat ve struktuøe dwsize Absolutní velikost struktury sestavené promìnným øetìzcem typu VARSTRING dwversion Promìnná identifikující verzi konstrukce struktury fwoptions Øídicí parametr dat ve struktuøe wwaitbong Není použit, musí být 0 commconfig Promìnná typu COMMCONFIG obsahující strukturu typu DCB s nastavením sériového portu místního modemu 80 VÁCLAV VACEK SÉRIOVÁ KOMUNIKACE VE WIN 32 A
MODEM_INFO Kategorie: Struktura Definice: typedef struct modem_info_tag { VARSTRING vs; HANDLE hcomm; char szdevicename[255]; } MODEM_INFO, FAR *LPMODEM_INFO; Popis: Struktura obsahující informace pøedávané prostøedím TAPI o modemu, který zprostøedkovává spojení Struktura je naplnìna daty voláním funkce linegetid Parametry: vs Promìnná typu VARSTRING obsahující popis konstrukce a velikost dat ve struktuøe hcomm Handle pro pøístup k sériovému portu modemu, který zprostøedkovává spojení szdevicename Øetìzec obsahující název modemu, který zprostøedkovává spojení A 6 POPIS PROSTØEDKÙ TAPI TELEFONNÍHO MODEMU 81
linecallbackfunc Kategorie: Funkce Syntaxe: VOID FAR PASCAL linecallbackfunc( DWORD hdevice, DWORD dwmsg, DWORD dwcallbackinstance, DWORD dwparam1, DWORD dwparam2, DWORD dwparam3 ); Popis: Funkce linecallbackfunc je pøedloha pro definici funkce obsluhy reakcí na události generované prostøedím TAPI pøi obsluze telefonního modemu Parametry: hdevice Handle pro identifikaci linky nebo objektu volání, požadující obsluhu reakce na událost Parametr musí být typu DWORD, protože typ HANDLE by mohl generovat chybu dwmsg Parametr specifikující typ obsluhované události dwcallbackinstance Tento parametr není v TAPI použit dwparam1 Parametr zprávy dwmsg dwparam2 Parametr zprávy dwmsg dwparam3 Parametr zprávy dwmsg Návratová hodnota: Funkce nemá návratovou hodnotu 82 VÁCLAV VACEK SÉRIOVÁ KOMUNIKACE VE WIN 32 A
LINECALLINFO Kategorie: Struktura Definice: typedef struct linecallinfo_tag { DWORD dwtotalsize; DWORD dwneededsize; DWORD dwusedsize; HLINE hline; DWORD dwlinedeviceid; DWORD dwaddressid; DWORD dwbearermode; DWORD dwrate; DWORD dwmediamode; DWORD dwappspecific; DWORD dwcallid; DWORD dwrelatedcallid; DWORD dwcallparamflags; DWORD dwcallstates; DWORD dwmonitordigitmodes; DWORD dwmonitormediamodes; LINEDIALPARAMS DialParams; DWORD dworigin; DWORD dwreason; DWORD dwcompletionid; DWORD dwnumowners; DWORD dwnummonitors; DWORD dwcountrycode; DWORD dwtrunk; DWORD dwcalleridflags; DWORD dwcalleridsize; DWORD dwcalleridoffset; DWORD dwcalleridnamesize; DWORD dwcalleridnameoffset; DWORD dwcalledidflags; DWORD dwcalledidsize; DWORD dwcalledidoffset; DWORD dwcalledidnamesize; DWORD dwcalledidnameoffset; DWORD dwconnectedidflags; DWORD dwconnectedidsize; DWORD dwconnectedidoffset; DWORD dwconnectedidnamesize; DWORD dwconnectedidnameoffset; A 6 POPIS PROSTØEDKÙ TAPI TELEFONNÍHO MODEMU 83
linesetdevconfig Kategorie: Funkce Syntaxe: LONG linesetdevconfig( DWORD dwdeviceid, LPVARSTRING lpdeviceconfig, DWORD dwsize, LPCSTR lpszdeviceclass ); Popis: Funkce uloží informace o aktuálním nastavení pøenosových vlastností vybraného linkového zaøízení z pamì ového bloku typu VARSTRING do prostøedí TAPI Parametry: dwdeviceid Identifikace popisovaného linkového zaøízení lpdeviceconfig Ukazatel na pamì ový blok typu VARSTRING ve kterém je uložena struktura typu DEVICECONFIG popisující aktuální nastavení linkového zaøízení dwsize Velikost alokovaného prostoru promìnné VARSTRING obsahující strukturu DEVICECONFIG lpszdeviceclass Øetìzec popisující tøídu linkového zaøízení V našem pøípadì to musí být comm/datamodem Návratová hodnota: Probìhla-li funkce bez chyby, pak je její návratová hodnota rovna 0 Pøi výskytu chyby je návratová hodnota rùzná od nuly a význam chyby zjistíme ze seznamu konstant LINEERR_ Constants, který je souèástí manuálu Windows SDK 102 VÁCLAV VACEK SÉRIOVÁ KOMUNIKACE VE WIN 32 A
lineshutdown Kategorie: Funkce Syntaxe: LONG lineshutdown( HLINEAPP hlineapp ); Popis: Funkce zlikviduje zinicializované prostøedí TAPI Parametry: hlineapp Handle aplikací použitého prostøedí TAPI Návratová hodnota: Probìhla-li funkce bez chyby, pak je její návratová hodnota rovna 0 Pøi výskytu chyby je návratová hodnota rùzná od nuly a význam chyby zjistíme ze seznamu konstant LINEERR_ Constants, který je souèástí manuálu Windows SDK A 6 POPIS PROSTØEDKÙ TAPI TELEFONNÍHO MODEMU 103