rs-232c---praktyczne-programowanie.-od-pascala-i-c++-do-delphi-i-buildera-.-wydanie-iii pełna wersja.pdf

(11080 KB) Pobierz
887649421.001.png
6
RS 232C — praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera
Funkcja GetCommState() .......................................................................................... 70
Funkcja SetCommState() .......................................................................................... 71
Funkcja CloseHandle() .............................................................................................. 71
Testowanie portu szeregowego ....................................................................................... 74
Struktura COMMPROP ............................................................................................ 78
Funkcja GetCommProperties() ................................................................................. 82
Struktura COMMCONFIG ....................................................................................... 88
Funkcje GetCommConfig() i SetCommConfig() ...................................................... 88
Funkcja CommConfigDialog() ................................................................................. 89
Struktura COMMTIMEOUTS .................................................................................. 90
Funkcje GetCommTimeouts() i SetCommTimeouts() .............................................. 91
Nawiązanie połączenia. Wariant I ................................................................................... 91
Segment inicjalizująco-konfiguracyjny ..................................................................... 92
Segment wysyłający komunikaty. Funkcja WriteFile() ............................................ 92
Segment odbierający komunikaty. Funkcja ReadFile() ............................................ 93
Przykładowa aplikacja ............................................................................................... 94
Nawiązanie połączenia. Wariant II .................................................................................. 97
Funkcja SetupComm() .............................................................................................. 98
Funkcja ClearCommError() ...................................................................................... 98
Struktura COMSTAT .............................................................................................. 100
Przykładowa aplikacja ............................................................................................. 102
Zamknięcie portu komunikacyjnego ....................................................................... 106
Nawiązanie połączenia. Wariant III .............................................................................. 107
Funkcje GetCommMask() i SetCommMask() ........................................................ 107
Funkcja WaitCommEvent() .................................................................................... 109
Przykładowa aplikacja działająca w środowisku tekstowym .................................. 110
Przykładowa aplikacja działająca w środowisku graficznym ................................. 118
Nawiązanie połączenia. Wariant IV .............................................................................. 123
Funkcja BuildCommDCB() .................................................................................... 123
Funkcja BuildCommDCBAndTimeouts() .............................................................. 125
Inne użyteczne funkcje .................................................................................................. 126
Podsumowanie ............................................................................................................... 128
Ćwiczenia ...................................................................................................................... 128
Wykorzystanie elementów Windows API w C++Builderze. Część II .......................... 129
Wysyłamy znak po znaku. Funkcja TransmitCommChar() .................................... 129
Wysyłamy pliki. Funkcje _lopen, _lread(), _lwrite(), _lclose() .............................. 133
Wykorzystanie komponentu klasy TTimer ............................................................. 143
Aplikacja nie lubi milczeć. Funkcja GetLastError() ............................................... 162
Break Time — czas oczekiwania aplikacji ............................................................. 167
Podsumowanie ........................................................................................................ 176
Ćwiczenia ................................................................................................................ 176
Wykorzystanie elementów Windows API w Delphi. Część I ....................................... 177
Testowanie portu szeregowego — inaczej .............................................................. 177
Rekord TCOMMPROP ........................................................................................... 183
Nawiązanie połączenia ............................................................................................ 191
Przykładowe aplikacje ............................................................................................. 194
Podsumowanie ........................................................................................................ 203
Ćwiczenia ................................................................................................................ 203
Wykorzystanie elementów Windows API w Delphi. Część II ...................................... 203
Wysyłamy znak po znaku ....................................................................................... 204
Wysyłamy pliki ....................................................................................................... 209
Timer w Delphi ....................................................................................................... 224
Podsumowanie ............................................................................................................... 238
Ćwiczenia ...................................................................................................................... 239
Spis treści
7
Rozdział 6. Aplikacje wielowątkowe ............................................................... 241
Najważniejszy jest użytkownik ..................................................................................... 242
Użytkownik steruje programem .............................................................................. 242
Możliwość anulowania decyzji ............................................................................... 243
Możliwość odbioru komunikatu nawet w trakcie wysyłania danych ..................... 243
Możliwość wysłania odrębnej informacji w trakcie transmisji pliku ..................... 243
Delphi ............................................................................................................................ 244
Funkcja BeginThread() ........................................................................................... 244
Konkurencja dla Timera .......................................................................................... 256
Klasa TThread ......................................................................................................... 264
Wielowątkowość i DLL-e ............................................................................................. 272
C++Builder .................................................................................................................... 280
Zamiast Timera ....................................................................................................... 289
Zamiast Timera. Inny sposób .................................................................................. 296
Klasa TThread ......................................................................................................... 304
Podsumowanie ............................................................................................................... 315
Ćwiczenia ...................................................................................................................... 315
Rozdział 7. Wykorzystanie niektórych narzędzi graficznych .............................. 317
Komponent klasy TChart ............................................................................................... 318
Podsumowanie ............................................................................................................... 328
Ćwiczenia ...................................................................................................................... 328
Rozdział 8. Przykładowe aplikacje wykorzystywane
w systemach pomiarowych ........................................................... 329
Kontroler temperatury ................................................................................................... 330
Aplikacja obsługująca kilka urządzeń ........................................................................... 347
Programowanie inteligentne .......................................................................................... 358
Brak powtarzalności kodu ....................................................................................... 359
Czytelność kodu ...................................................................................................... 360
Łatwość testowania ................................................................................................. 364
Podsumowanie ............................................................................................................... 366
Ćwiczenia ...................................................................................................................... 366
Rozdział 9. Tworzenie komponentów .............................................................. 369
Komponent TOpenSerialPort. Realizacja w Delphi ...................................................... 369
Testowanie komponentu ......................................................................................... 374
Komponent TOpenSerialPort. Realizacja w C++Builderze .......................................... 380
Testowanie komponentu ......................................................................................... 386
Komponenty aktywne .................................................................................................... 389
Kompilacja projektu zawierającego komponent aktywny ...................................... 393
Odczytywanie i modyfikacja wartości własności komponentu aktywnego ............ 395
Komponenty w BDS 2006 ............................................................................................. 397
Podsumowanie ............................................................................................................... 398
Ćwiczenia ...................................................................................................................... 398
Rozdział 10. Modelowanie oprogramowania sterującego portem szeregowym .... 399
Schematy dziedziczenia ................................................................................................. 400
Ukrywanie konstruktora ................................................................................................ 405
Interfejsy ........................................................................................................................ 409
Delegowanie operacji .................................................................................................... 415
Delegowanie realizacji interfejsu do własności ............................................................. 422
Podsumowanie ............................................................................................................... 426
Ćwiczenia ...................................................................................................................... 427
8
RS 232C — praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera
Rozdział 11. POSIX .......................................................................................... 435
Polecenie stty ................................................................................................................. 436
Ustawienia kontroli przesyłu danych (sterowanie transmisją) ................................ 437
Ustawienia wejściowe ............................................................................................. 437
Ustawienia wyjściowe ............................................................................................. 439
Ustawienia czasów oczekiwania ............................................................................. 439
Ustawienia lokalne .................................................................................................. 440
Specjalne znaki sterujące ........................................................................................ 441
Łączenie atrybutów ................................................................................................. 442
Podstawowe funkcje obsługi portu szeregowego .......................................................... 442
Funkcja open() ......................................................................................................... 442
Funkcja read() ......................................................................................................... 443
Funkcja write() ........................................................................................................ 443
Funkcja close() ........................................................................................................ 443
Struktura termios ........................................................................................................... 444
Funkcja tcgetattr() ................................................................................................... 448
Funkcja tcsetattr() .................................................................................................... 448
Funkcje cfgetispeed() i cfgetospeed() ..................................................................... 449
Funkcje cfsetispeed() i cfsetospeed() ...................................................................... 449
Funkcja tcflush() ..................................................................................................... 450
Funkcja tcdrain() ..................................................................................................... 451
QNX ............................................................................................................................... 451
Funkcja dev_insert_chars() ..................................................................................... 453
Funkcja dev_ischars() ............................................................................................. 453
Funkcja dev_read() .................................................................................................. 454
Funkcja Receive() ................................................................................................... 455
Funkcja Send() ........................................................................................................ 455
Funkcja Creceive() .................................................................................................. 455
Funkcja Reply() ....................................................................................................... 456
Funkcja qnx_proxy_attach() ................................................................................... 456
Funkcja qnx_proxy_detach() ................................................................................... 456
Podsumowanie ............................................................................................................... 457
Ćwiczenia ...................................................................................................................... 457
Dodatek A Specyfikacja funkcji CreateFile() — operacje plikowe ................... 461
Dodatek B Specyfikacja struktur MODEMDEVCAPS, MODEMSETTINGS
oraz funkcji GetCommModemStatus() ........................................... 467
MODEMDEVCAPS ...................................................................................................... 467
MODEMSETTINGS ..................................................................................................... 470
GetCommModemStatus() .............................................................................................. 471
Dodatek C Transmisja asynchroniczna. Funkcje rozszerzone ........................... 473
Funkcja WriteFileEx() ................................................................................................... 473
Funkcja ReadFileEx() .................................................................................................... 474
Funkcja FileIOCompletionRoutine() ............................................................................. 474
Funkcja SleepEx() ......................................................................................................... 475
Funkcja WaitForSingleObjectEx() ................................................................................ 475
Dodatek D Zamiana liczb z postaci dziesiętnej na binarną .............................. 477
Dodatek E Funkcje CreateThread(), CreateMutex() i CreateSemaphore() ....... 481
Skorowidz .................................................................................... 487
Rozdział 5.
Programowa obsługa
interfejsu RS 232C
w Windows
Czwarte prawo Murphy’ego
Gdy dojdziesz do wniosku, że są cztery sposoby, na jakie może się nie powieść
dane przedsięwzięcie, i zabezpieczysz się przed nimi, rychło pojawi się piąta
możliwość.
Murphy’s 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 algorytmów
realizujących transmisję szeregową w środowisku Windows, które charakteryzuje się
pewnymi cechami niemającymi odpowiedników w MS-DOS. Poznanie i umiejętne
wykorzystanie tych cech sprawi, iż problem obsługi interfejsów szeregowych z poziomu
Windows — uważany powszechnie za trudny — przestanie być dla nas tajemnicą.
Pokażemy, w jaki sposób należy tworzyć aplikacje służące do programowej obsługi łącza
szeregowego RS 232C zarówno w C++, C++Builderze, jak i w Delphi. Wśród programi-
stów istnieje zauważalny podział na osoby programujące głównie w Delphi oraz na prefe-
rujące Buildera lub ogólnie C++ dla Windows. Jednak zdaniem wielu osób uniwersalność
jest jedną z tych cech, jakie powinny charakteryzować programistę. W rozdziale tym
przybliżymy Czytelnikowi podobieństwa i różnice w sposobie konstrukcji algorytmów
realizujących transmisję szeregową, pisanych w Delphi oraz Builderze.
W dalszej części książki będziemy się spotykać z typami danych, których poznanie i zro-
zumienie ma kluczowe znaczenie w projektowaniu aplikacji obsługujących urządzenia
zewnętrzne. Zacznijmy od ich przypomnienia. W tabeli 5.1 przedstawiono porównanie
podstawowych typów zmiennych wykorzystywanych w kompilatorach, które będą dla nas
istotne. Większości z nich można używać zamiennie, pisząc zarówno w Delphi, jak
i w C++Builderze.
Zgłoś jeśli naruszono regulamin