Professional Documents
Culture Documents
programowanie. Od Pascala
i C++ do Delphi i Buildera.
Wydanie III
Autor: Andrzej Daniluk
ISBN: 978-83-246-0778-5
Format: B5, stron: 504
Spis treci
Spis treci
Przedmowa do wydania trzeciego ...................................................... 9
Wprowadzenie ................................................................................ 11
Rozdzia 1. Definicja interfejsu ......................................................................... 15
Rozdzia 2. Nowoczesna transmisja asynchroniczna oraz standard RS 232C ...... 19
RTS-CTS handshaking .................................................................................................... 24
Konwertery interfejsu RS 232C ...................................................................................... 28
Konwertery USB/RS 232C .............................................................................................. 29
Waciwoci portu konwertera .................................................................................. 31
Protok XON-XOFF ...................................................................................................... 33
Protok ENQ-ACK ........................................................................................................ 33
Protok ETX-ACK ......................................................................................................... 34
Protok SOH-ETX ......................................................................................................... 34
Protokoy typu master-slave ............................................................................................ 34
Rola oprogramowania a podstawowe funkcje interfejsu ................................................. 36
Podsumowanie ................................................................................................................. 38
Spis treci
Rozdzia 5.
Programowa obsuga
interfejsu RS 232C
w Windows
Czwarte prawo Murphyego
Gdy dojdziesz do wniosku, e s cztery sposoby, na jakie moe si nie powie
dane przedsiwzicie, i zabezpieczysz si przed nimi, rycho pojawi si pita
moliwo.
Murphys Law and other reasons why things go wrong!,
Artur Bloch, Price Stern Sloan Inc. 1977.
Rozdzia ten ma za zadanie zapozna Czytelnika ze sposobami konstrukcji algorytmw
realizujcych transmisj szeregow w rodowisku Windows, ktre charakteryzuje si
pewnymi cechami niemajcymi odpowiednikw w MS-DOS. Poznanie i umiejtne
wykorzystanie tych cech sprawi, i problem obsugi interfejsw szeregowych z poziomu
Windows uwaany powszechnie za trudny przestanie by dla nas tajemnic.
Pokaemy, w jaki sposb naley tworzy aplikacje suce do programowej obsugi cza
szeregowego RS 232C zarwno w C++, C++Builderze, jak i w Delphi. Wrd programistw istnieje zauwaalny podzia na osoby programujce gwnie w Delphi oraz na preferujce Buildera lub oglnie C++ dla Windows. Jednak zdaniem wielu osb uniwersalno
jest jedn z tych cech, jakie powinny charakteryzowa programist. W rozdziale tym
przybliymy Czytelnikowi podobiestwa i rnice w sposobie konstrukcji algorytmw
realizujcych transmisj szeregow, pisanych w Delphi oraz Builderze.
W dalszej czci ksiki bdziemy si spotyka z typami danych, ktrych poznanie i zrozumienie ma kluczowe znaczenie w projektowaniu aplikacji obsugujcych urzdzenia
zewntrzne. Zacznijmy od ich przypomnienia. W tabeli 5.1 przedstawiono porwnanie
podstawowych typw zmiennych wykorzystywanych w kompilatorach, ktre bd dla nas
istotne. Wikszoci z nich mona uywa zamiennie, piszc zarwno w Delphi, jak
i w C++Builderze.
60
Rozmiar w bajtach
ShortInt
Znak +/
Typ
C++Builder
Integer
signed char
SmallInt
Integer
short
LongInt
Integer
Byte
Bez znaku
Integer
unsigned char
Word
Bez znaku
Integer
unsigned short
Integer
Integer
int
Cardinal
Bez znaku
Integer
unsigned int
Boolean
true/false
ByteBool
true/false
Bez znaku
WordBool
bool
unsigned char
Integer
unsigned short
true/false
Bez znaku
Integer
LongBool
true/false
Bez znaku
Integer
AnsiChar
1 znak ANSI
Character
WideChar
wchar_t
Char
Bez znaku
Character
char
char
AnsiString
3GB
ANSIChar
AnsiString
AnsiString
String[n]
n = 1.255
ANSIChar
String
SmallString<n>
ShortString
255
ANSIChar
String
SmallString<255>
String
ANSIChar
AnsiString
AnsiString
Single
float
Double
double
Extended
10
long double
Real
double
Pointer
Generic pointer
(wskanik oglny,
adresowy)
void *
PChar
Bez znaku
Pointer to characters
unsigned char *
PAnsiChar
Bez znaku
Pointer to ANSIChar
unsigned char *
Comp
Comp
Konstruujc nasze programy, bdziemy starali si jak najszerzej wykorzystywa standardowe zasoby Windows, w szczeglnoci tzw. interfejs programisty Windows API (ang.
Application Programming Interface). Jego umiejtne wykorzystanie umoliwi naszym
aplikacjom byskawiczne skonfigurowanie i uzyskanie dostpu do portu komunikacyjnego. Bdem jest twierdzenie, e sama nawet bardzo dobra znajomo jzyka pro-
61
62
Skrt angielski
Znaczenie
array
Tablica
bool
by
Znak (bajt)
cb
count of bytes
Liczba bajtw
ch
char
Znak
dw
double word
Podwjne sowo
evt
event
Zdarzenie
flag
Znacznik
fdw
Znacznik typu dw
fn
function
Funkcja
handle
Identyfikator (uchwyt)
integer
id
(ID) identification
Identyfikacja
in
input
long int
lp
long pointer
lpc
lpfdw
lpfn
short or int
np
near pointer
out
output
pointer
pfn
pointer to function
Wskanik do funkcji
que
queue
s (sz)
string
acuch znakw
st
struct
Struktura
type
Typ
unsigned
Bez znaku
Sowo
wc
WCHAR
63
Znaczenie
BOOL
BYTE
unsigned char
DWORD
unsigned long
LPDWORD
unsigned long *
LONG
long
LPLONG
long *
LPCSTR
const char *
LPCTSTR
LPSTR
char *
void *
LPCVOID
const void *
UINT
unsigned int
WORD
unsigned short
DWORD32
DWORD64
INT
INT32
INT64
LONG32
LONG64
LONGLONG
Osobnym typem danych, bardzo czsto stosowanym w aplikacjach Windows, jest typ
HANDLE. Jest on 32- lub 64-bitowym typem danych cakowitych oznaczajcym tzw. uchwyt
(ang. handle). Naley rozumie, i w rzeczywistoci dane typu HANDLE nie obrazuj jakich
tajemniczych uchwytw zakadanych na elementy aplikacji s to po prostu 32- lub
64-bitowe liczby identyfikujce okrelony zasb aplikacji, systemu operacyjnego lub
samego komputera. Z tego wzgldu dane typu HANDLE czsto wygodniej i zrczniej jest
okrela mianem identyfikatorw, ktrych wartoci przechowywane s w okrelonym
miejscu w pamici. Cech charakterystyczn identyfikatorw jest to, i jeli na pocztku
programu inicjuje si je okrelonymi wartociami, w momencie zakoczenia pracy
aplikacji lub jej fragmentu naley przydzielon im pami odpowiednio zwalnia. W tym
celu wykorzystuje si funkcj API Windows:
BOOL CloseHandle(HANDLE hObject);
64
Wykorzystanie elementw
Windows API w C++Builderze. Cz I
Poznawanie tajnikw obsugi portu szeregowego w Windows rozpoczniemy, z czysto
praktycznych wzgldw, od pisania programw w C++Builderze. C++ ma skadni tak
jak API, dlatego prociej nam bdzie zapozna si z budow funkcji oraz struktur oferowanych przez interfejs programisty. Uatwi to te zrozumienie, w jaki sposb i w jakiej
kolejnoci naley umieszcza je w programie.
65
Struktura DCB
Fundamentalne znaczenie ma struktura kontroli urzdze zewntrznych DCB (ang. Device
Control Block). W Windows struktura DCB w pewnym sensie odpowiada funkcji 00h
przerwania 14h BIOS-u. Udostpnia nam jednak nieporwnywalnie wiksze moliwoci
programowej obsugi cza szeregowego; umoliwia bezporednie programowanie rejestrw ukadu UART. W tabelach 5.4 oraz 5.5 przedstawiono specyfikacj bloku kontroli
urzdze zewntrznych DCB.
Wikszo pl tej struktury to pola jednobitowe. fDtrControl, fRtsControl s polami
dwubitowymi. Aktualnie nieuywane w XP pole fDummy2 jest siedemnastobitowe. W perspektywie, wraz z wReserved oraz wReserved1, bdzie wykorzystane na potrzeby innych
protokow komunikacyjnych. W Windows API blok kontroli urzdze deklarowany jest
w sposb nastpujcy:
typedef struct _DCB {
DWORD DCBlength;
...
} DCB;
Deklaracja ta tworzy nowe sowo kluczowe typu DCB (struktura). Zalecane jest, aby przed
uyciem tej struktury jako parametru do elementu DCBlength wpisa warto sizeof(DCB).
Struktur tworzy zbir logicznie powizanych elementw, np. zmiennych lub (i) pl
bitowych. Pole bitowe stanowi zbir przylegajcych do siebie bitw, znajdujcych si
w jednym sowie. Adres struktury pobieramy za pomoc operatora referencji &, co
umoliwia nam dziaania na jej skadowych. Do struktury jako caoci moemy odwoa
si przez jej nazw, za do poszczeglnych jej elementw, czyli zmiennych oraz pl
bitowych, przez podanie nazwy zmiennej reprezentujcej struktur oraz po kropce
nazwy konkretnej zmiennej lub pola struktury, np.: dcb.fDtrControl = DTR_CONTROL_
DISABLE. Operator skadowych struktur "." jest lewostronnie czny. Grupa zwizanych
ze sob zmiennych i pl bitowych traktowana jest jako jeden obiekt.
Funkcja CreateFile()
Jest to funkcja suca do utworzenia i otwarcia pliku lub urzdzenia. Ju sama nazwa
wskazuje, e moe by wykorzystywana nie tylko do obsugi portu szeregowego. Teraz
jednak bdzie nas interesowa tylko to konkretne zastosowanie. Specyfikacja zasobw
funkcji CreateFile() najczciej uywanych do operacji plikowych zamieszczona jest
w dodatku A. Funkcja ta da nam 32- lub 64-bitowy identyfikator danego portu przechowywany pod waciwoci HANDLE, do ktrego bd adresowane wszystkie komunikaty.
66
Tabela 5.4. Zmienne struktury DCB reprezentujce dopuszczalne parametry ustawie portu szeregowego
Typ
Zmienna
Znaczenie
Warto,
staa symboliczna
DWORD
DCBlength
Rozmiar struktury
Naley wpisa
DWORD
BaudRate
WORD
wReserved
Nieuywane
WORD
XonLim
WORD
XoffLim
BYTE
ByteSize
5, 6, 7, 8
BYTE
Parity
EVENPARITY parzysta;
MARKPARITY bit parzystoci stale
rwny 1;
NOPARITY brak kontroli;
ODDPARITY nieparzysta
BYTE
StopBits
char
XonChar
char
XoffChar
char
ErrorChar
char
EofChar
Opcjonalnie: 0
Char
EvtChar
Opcjonalnie: 0
WORD
wReserved1
Obecnie nieuywane
67
Tabela 5.5. Pola bitowe reprezentujce dopuszczalne wartoci znacznikw sterujcych struktury DCB
Warto, znaczenie,
staa symboliczna
Typ
Pole bitowe
Waciwoci pola
DWORD
fBinary
TRUE
DWORD
fParity
Umoliwia ustawienie
sprawdzania parzystoci
sposobu reakcji na bit
parzystoci
DWORD
fOutxCtsFlow
Umoliwia ustawienie
sprawdzania sygnau na linii
CTS w celu kontroli danych
wyjciowych
sprawdzany
TRUE jeeli sygna CTS jest
DWORD
fOutxDsrFlow
Umoliwia ustawienie
sprawdzania sygnau na linii
DSR w celu kontroli danych
wyjciowych
fDtrControl
DTR_CONTROL_DISABLE / 0 sygna
na linii DTR jest nieaktywny;
DTR_CONTROL_ENABLE / 1 sygna na linii
DWORD
fTXContinueOnXoff
fDsrSensitivity
Kontrola przerwania
transmisji w przypadku
przepenienia bufora
wejciowego i ewentualnie
wystpienia znakw
XoffChar oraz XonChar
Specyfikacja wykorzystania
poziomu sygnau na linii DSR
68
Tabela 5.5. Pola bitowe reprezentujce dopuszczalne wartoci znacznikw sterujcych struktury DCB
cig dalszy
Typ
Pole bitowe
Waciwoci pola
DWORD
fInX
Programowe ustawienie
protokou XON-XOFF w czasie
odbioru danych
Warto, znaczenie,
staa symboliczna
TRUE znak XoffChar jest wysyany,
jest ustawiony
DWORD
fRtsControl
Specyfikacja kontroli
sygnau na linii RTS
RTS_CONTROL_DISABLE / 0 sygna
fOutX
Programowe ustawienie
protokou XON-XOFF w czasie
wysyania danych
fErrorChar
DWORD
fNull
Odrzucenie odebranych
niewanych lub
uszkodzonych bajtw
69
Tabela 5.5. Pola bitowe reprezentujce dopuszczalne wartoci znacznikw sterujcych struktury DCB
cig dalszy
Typ
Pole bitowe
Waciwoci pola
DWORD
fAbortOnError
Ustawienie wstrzymywania
operacji nadawanie-odbir
przy wykryciu bdu
transmisji
Warto, znaczenie,
staa symboliczna
TRUE wszelkie operacje nadawania
fDummy2
Zarezerwowane, nieuywane
Oglnie rzecz ujmujc, przed rozpoczciem czytania z portu szeregowego (lub innego
urzdzenia) naley o powyszym fakcie poinformowa system operacyjny. Czynno t
okrela si jako otwieranie portu do transmisji. Jednak zanim zaczniemy wykonywa
jakiekolwiek operacje na porcie, system operacyjny musi sprawdzi, czy wybrany port
komunikacyjny istnieje i czy w danym momencie nie jest ju przypadkiem w jaki sposb
wykorzystywany. W przypadku uzyskania dostpu do portu system operacyjny przekazuje do aplikacji jego identyfikator. We wszystkich operacjach wejcia-wyjcia zamiast
szczegowej nazwy portu komunikacyjnego uywa si wanie jego identyfikatora.
Skadnia CreateFile() wyglda nastpujco1:
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD ShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
Niekiedy identyfikatory tego typu nazywa si uchwytami. Niestety, dosowne przetumaczenie angielskiego sowa handle jako uchwyt, np. handle of drawer uchwyt,
rczka szuflady, nie jest w peni adekwatne. Waciwsze wydaje si utosamianie
handle z identyfikatorem (unikaln wartoci zlokalizowan w danym obszarze pamici i skojarzon z konkretnym portem komunikacyjnym, oknem czy plikiem). W potocznej angielszczynie handle moe rwnie oznacza ksyw pozwalajc na szybk
identyfikacj danej osoby lub rzeczy. Koncepcja identyfikatorw nie jest niczym nowym,
stosowano j ju w MS-DOS, jednak dopiero w Windows zyskaa now jako.
Na tym etapie naszych rozwaa tylko trzy parametry powyszej funkcji s istotne dla
kompletnej konfiguracji portu szeregowego. Wyjanimy teraz ich znaczenie.
70
*portName = "COM2";
Funkcja GetCommState()
Funkcja zwraca ustawienia portu ostatnio zapamitane w strukturze DCB:
BOOL GetCommState(HANDLE hCommDev, LPDCB lpdcb),
71
gdzie:
hCommDev jest identyfikatorem danego portu, CreateFile() zwraca nam ten
identyfikator, a lpdcb jest wskanikiem do struktury DCB zawierajcej informacj
Funkcja SetCommState()
Wybrany przez nas port szeregowy ostatecznie skonfigurujemy zgodnie ze specyfikacj
struktury DCB za pomoc funkcji SetCommState(), ktra reinicjalizuje i uaktualnia wszystkie dostpne parametry w ustawieniach cza szeregowego:
BOOL SetCommState(HANDLE hCommDev, LPDCB lpdcb)
Jednak tutaj parametr, na ktry wskazuje lpdcb, musi ju zawiera informacje o nowych,
wybranych przez nas parametrach ustawie portu komunikacyjnego. Naley te pamita,
e funkcja SetCommState() nie zostanie wykonana pomylnie, jeeli posugujc si struktur DCB, element XonChar ustalimy identycznie z XoffChar.
Funkcja CloseHandle()
Przed zakoczeniem dziaania aplikacji otwarty port szeregowy naley koniecznie
zamkn i zwolni obszar pamici przydzielony na jego identyfikator, korzystajc z:
BOOL CloseHandle(HANDLE hCommDev)
72
W praktyce zdarzaj si jednak sytuacje, w ktrych zamknicie portu okae si niemoliwe, np. z powodu jakiego bdu w algorytmie lub niewaciwego sposobu wywoania
danej funkcji. Mwimy wwczas, e program si zaama lub zawiesi. Ten problem
powtarza si czsto w trakcie testowania programw komunikacyjnych. Nie naley wwczas od razu uywa kombinacji klawiszy Ctrl, Alt, Del. W takich przypadkach wygodniej
jest rozwin z gwnego menu opcj Project oraz wybra Compile Unit, tak jak pokazano to na rysunku 5.1. Nazwa dziaajcej aplikacji powinna si pojawi na dolnym
pasku zada.
Rysunek 5.1. Przykadowy sposb wstrzymywania dziaania aplikacji z otwartym portem szeregowym
73
74
Listing 5.1. Kod gwnego moduu aplikacji testujcej podstawowe parametry transmisji portu szeregowego
#include <vcl.h>
#pragma hdrstop
#include "Unit_05_01.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hCommDev; // identyfikator portu szeregowego
// void *hCommDev;
DCB
dcb;
// struktura kontroli portu
75
76
77
{
case ONESTOPBIT:
Edit4->Text = "1";
break;
case TWOSTOPBITS:
Edit4->Text = "2";
break;
case ONE5STOPBITS:
Edit4->Text = "1.5";
break;
}
//--sprawdzenie i wywietlenie stanu linii DTR----------switch (dcb.fDtrControl)
{
case DTR_CONTROL_DISABLE:
Edit5->Text = "Nieaktywna";
break;
case DTR_CONTROL_ENABLE:
Edit5->Text = "Aktywna";
break;
case DTR_CONTROL_HANDSHAKE:
Edit5->Text = "Handshaking";
break;
}
}
//----------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action=caFree;
}
//--------------------------------------------------------------
Stworzylimy zatem bardzo prost, wrcz dydaktyczn aplikacj, ale taki wanie by
nasz cel. Moemy zauway, e obsuga tego programu sprowadza si do wywoania
funkcji obsugi zdarzenia OpenCommClick(). Nacinicie przycisku Otwrz port powoduje
automatyczne skonfigurowanie wybranego wczeniej portu szeregowego oraz odczytanie
jego aktualnie wybranych ustawie. Dobrze byoby, gdyby Czytelnik sprbowa samodzielnie skonfigurowa port z wiksz liczb parametrw, a nastpnie je odczyta. Nabiera
si przez to wikszej wprawy w manipulowaniu znacznikami struktury DCB. Zamknicie
portu i aplikacji nastpi po wywoaniu funkcji obsugi zdarzenia CloseCommClick(),
w ktrej z kolei dokonujemy wywoania funkcji CloseSerialPort() zamykajcej port szeregowy i aplikacj. Przygldajc si kodowi funkcji obsugi zdarzenia OpenCommClick(),
zauwaymy, e tu po wywoaniu CreateFile() zastosowalimy nastpujc instrukcj
warunkow sprawdzajc, czy funkcja ta zwrcia prawidowy identyfikator zadeklarowanego portu:
if (hCommDev != INVALID_HANDLE_VALUE) {
...
}
else {
switch ((int)hCommDev) {
78
};
Jeeli mimo wszystko port nie zosta otwarty prawidowo, dobrze by byo, gdyby aplikacja powiadomia nas o tym fakcie. W tym celu mona skorzysta z komunikatw
Windows typu IE_ (ang. Identify Error bd identyfikacji portu) urzdzenia lub jego
ustawie. W tabeli 5.6 przedstawiono najczciej otrzymywane od Windows komunikaty
tego typu.
Tabela 5.6. Najczciej uywane komunikaty bdnej identyfikacji ustawie portu szeregowego
Identyfikacja komunikatu
IE_BADID
Warto
Znaczenie
IE_BAUDRATE
12
IE_BYTESIZE
11
IE_DEFAULT
IE_HARDWARE
10
IE_MEMORY
IE_NOPEN
IE_OPEN
Struktura COMMPROP
W celu dokadniejszego zapoznania si z moliwociami testowania systemw komunikacyjnych dostpnych w Windows w tabeli 5.7 przedstawiono bardzo uyteczn struktur
oferowan przez API. Zawarte w niej informacje mog by wykorzystywane do penego
odczytywania wszystkich istotnych parametrw interesujcego nas cza komunikacyjnego oraz usug potencjalnie przez nie oferowanych.
79
Element struktury
Znaczenie
WORD
wPacketLength
WORD
wPacketVersion
Wersja struktury
Nr 2 w Win 9x, XP
DWORD
dwServiceMask
okrelone
DWORD
dwReserved1
Zarezerwowane, nieuywane
DWORD
dwMaxTxQueue
Maksymalny rozmiar
wewntrznego bufora wyjciowego
nadajnika (w bajtach)
Maksymalny rozmiar
wewntrznego bufora wejciowego
odbiornika (w bajtach)
BAUD_075
DWORD
DWORD
dwMaxRxQueue
dwMaxBaud
maksymalnej wartoci
maksymalnej wartoci
BAUD_110
BAUD_134_5
75 b/s
110 b/s
134.5 b/s
BAUD_150
150 b/s
BAUD_300
300 b/s
BAUD_600
600 b/s
BAUD_1200
1200 b/s
BAUD_1800
1800 b/s
BAUD_2400
2400 b/s
BAUD_4800
4800 b/s
BAUD_7200
7200 b/s
BAUD_9600
9600 b/s
BAUD_14400
14 400 b/s
BAUD_19200
19 200 b/s
BAUD_38400
38 400 b/s
BAUD_56K
56K b/s
BAUD_57600
57 600 b/s
BAUD_115200
BAUD_128K
128K b/s
BAUD_USER programowalne
80
Element struktury
Znaczenie
DWORD
dwProvSubType
PST_FAX faks
PST_LAT protok LAT
niewyspecyfikowana sie
PST_PARALLELPORT port
rwnolegy
PST_RS232
RS 232
PST_RS422
RS 422
PST_RS423
RS 423
PST_RS449
RS 449
PST_SCANNER skaner
PST_TCPIP_TELNET protok
TCP/IP
PST_UNSPECIFIED brak
specyfikacji
PST_X25 protok X.25
DWORD
DwSettableParams
SP_BAUD prdko
SP_DATABITS dugo sowa
danych
SP_HANDSHAKING kontrola
przepywu danych
SP_PARITY parzysto
SP_PARITY_CHECK sprawdzanie
parzystoci
SP_RLSD sygna RLSD
SP_STOPBITS bity stopu
81
Element struktury
Znaczenie
DWORD
dwProvCapabilities
przeterminowania
PCF_PARITY_CHECK sprawdzanie
parzystoci
PCF_RLSD kontrola RLSD
PCF_RTSCTS kontrola RTS-CTS
PCF_SETXCHAR moliwo
uycia protokou XON/XOFF
PCF_SPECIALCHARS specjalny
znak
PCF_TOTALTIMEOUTS kontrola
protokou XON-XOFF
DWORD
dwSettableBaud
WORD
wSettableData
DATABITS_5
DATABITS_6
DATABITS_7
DATABITS_8
DATABITS_16
DATABITS_16X szczeglna
WORD
dwCurrentTxQueue
wSettableStopParity
aktualnie dostpna
DWORD
dwCurrentRxQueue
aktualnie dostpna
82
Typ
Element struktury
Znaczenie
DWORD
dwProvSpec1
DWORD
dwProvSpec2
Jak wyej
WCHAR
wcProvChar[1]
Jak wyej
W zalenoci od dwProvSubType
aplikacje powinny ignorowa
ten czon, chyba e zawieraj
szczegowe informacje odnonie
do formatu danych wymaganych
przez dostarczyciela usugi
Jeeli dwProvSubType przypisano
PST_MODEM, musi nastpi
odwoanie do struktur
2
MODEMDEVCAPS oraz MODEMSETTINGS ;
dwProvSpec1 i dwProvSpec2 nie s
wwczas uywane
Funkcja GetCommProperties()
Funkcj, ktra zwraca aktualne waciwoci portu komunikacyjnego identyfikowanego
przez hCommDev, bdzie:
BOOL GetCommProperties(HANDLE
hCommDev, LPCOMMPROP
lpCommProp);
83
Rysunek 5.5.
Formularz gwny
uruchomionego
projektu
Projekt_R05_02.bpr
commprop.wPacketLength = sizeof(COMMPROP);
//...
CommProp.dwProvSpec1 = COMMPROP_INITIALIZED;
identyfikator portu
waciwoci portu
wskanik do nazwy portu
szeregowego
84
85
86
& DATABITS_7);
& DATABITS_8);
& DATABITS_16);
&
if (TrackBar1->Position == 3) {
switch (TrackBar2->Position) {
case 1: {
Label2->Caption = "STOPBITS_10";
Edit2->Text=IntToStr(commprop.wSettableStopParity
STOPBITS_10);
break;
}
case 2: {
Label2->Caption = "STOPBITS_15";
Edit2->Text=IntToStr(commprop.wSettableStopParity
STOPBITS_15);
break;
}
case 3: {
Label2->Caption = "STOPBITS_20";
Edit2->Text=IntToStr(commprop.wSettableStopParity
STOPBITS_20);
break;
}
case 4: {
Label2->Caption = "PARITY_NONE";
Edit2->Text=IntToStr(commprop.wSettableStopParity
PARITY_NONE);
break;
}
case 5: {
Label2->Caption = "PARITY_ODD";
&
&
&
&
87
Edit2->Text=IntToStr(commprop.wSettableStopParity &
PARITY_ODD);
break;
}
case 6: {
Label2->Caption = "PARITY_EVEN";
Edit2->Text=IntToStr(commprop.wSettableStopParity &
PARITY_EVEN);
break;
}
case 7: {
Label2->Caption = "PARITY_MARK";
Edit2->Text=IntToStr(commprop.wSettableStopParity &
PARITY_MARK);
break;
}
case 8: {
Label2->Caption = "PARITY_SPACE";
Edit2->Text=IntToStr(commprop.wSettableStopParity &
PARITY_SPACE);
break;
}
} // koniec switch
} // koniec if
}
//-------------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action=caFree;
}
//--------------------------------------------------------------
88
Warto
127
Maska
Rezultat maskowania
SP_PARITY
SP_BAUD
SP_DATABITS
SP_STOPBITS
Bit 7
0
0
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
SP_HANDSHAKING
16
SP_PARITY_CHECK
32
SP_RLSD
64
ktry bdzie prawdziwy, gdy oba bity bd skasowane. Jednak osobom mniej zaawansowanym w operacjach bitowych odradzabym jakiekolwiek prby ingerowania w zawarto COMMPROP.
Struktura COMMCONFIG
Struktura COMMCONFIG zawiera informacje o stanie konfiguracji danego urzdzenia komunikacyjnego. Tabela 5.9 prezentuje jej zasoby.
Windows API COMMCONFIG deklaruje nastpujco:
typedef struct _COMM_CONFIG {
DWORD dwSize;
...
} COMMCONFIG, *LPCOMMCONFIG;
Powysza deklaracja tworzy dwa nowe sowa kluczowe typu COMMCONFIG (struktura) oraz
LPCOMMCONFIG (wskanik do struktury).
89
Element struktury
Znaczenie
Zawarto
DWORD
dwSize
Naley wpisa
WORD
wVersion
Wersja struktury
Naley odczyta
WORD
wReserved
Zarezerwowane
DCB
dcb
Patrz DCB
DWORD
dwProviderSubType
Patrz COMMPROP
DWORD
dwProviderOffset
DWORD
dwProviderSize
WCHAR
wcProviderData[1]
Funkcja CommConfigDialog()
Funkcja wywietla okno dialogowe zawierajce aktualne ustawienia parametrw portu
szeregowego.
BOOL CommConfigDialog(LPTSTR lpszName, HWND hWnd,
LPCOMMCONFIG lpCC);
lpszName jest wskanikiem do acucha znakw okrelajcego nazw portu, hWnd jest
identyfikatorem waciciela aktualnie wywietlanego okna dialogowego, a lpCC wskazuje
na struktur COMMCONFIG. Uycie tej funkcji, np. w kontekcie obsugi wybranego zdarzenia, moe wyglda nastpujco:
//-------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
90
}
//--------------------------------------------------------------
Struktura COMMTIMEOUTS
Zasoby struktury COMMTIMEOUTS przedstawione s w tabeli 5.10. Udostpniaj one informacje o tzw. czasach przeterminowania transmisji w trakcie przesyania danych (ang.
time-out of transmission). Jest to wany termin, z ktrym niektrzy na pewno ju si
zetknli. W trakcie transmisji asynchronicznej COMMTIMEOUTS determinuje zachowanie si
takich funkcji jak ReadFile() czy WriteFile().
Tabela 5.10. Informacje zawarte w strukturze COMMTIMEOUTS
Typ
Element struktury
Waciwoci
DWORD
ReadIntervalTimeout
DWORD
ReadTotalTimeoutMultiplier
DWORD
ReadTotalTimeoutConstant
DWORD
WriteTotalTimeoutMultiplier
DWORD
WriteTotalTimeoutConstant