Jak obsłużyć porty pod Windowsami NT
fatalbomb
Uwaga: artykuł dotyczy obsługi linii sterujących portu COM. Obsługa transmisji to nieco inna sprawa (update coming soon :-)).
Artykuł jest uproszczoną wersją Obsługa portu com z poziomu Delphi i jest właściwie uporządkowaniem informacji o dostępie do linii sterujących.
Czasami może przydać się obsługa portu COM pod Windowsem. Niestety, napotykamy od razu kilka problemów:
- W Delphi nie ma tablicy Port.
- W systemach linii NT (w tym WinXP) próba dorwania się do portów "na siłę" asemblerem wywala nam błąd "Privileged operation".
Przyczyną jest architektura systemów wywodzących się z linii NT (NT 3.x, NT 4, Win2000, WinXP, Win2003). Nie pozwala ona na bezpośrednie odwoływanie się do sprzętu. W takim przypadku trzeba dostać się do portu COM... jak do modemu.
Otwarcie portu
Najpierw port musimy otworzyć:
var hPort:THandle;
...
procedure OpenPort;
begin
hPort := CreateFile ('port', GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if hPort = INVALID_HANDLE_VALUE then ShowMessage ('Błąd #'+IntToStr (GetLastError));
end;
Nie objaśniam już szczegółów działania funkcji CreateFile. W każdym razie pod 'port' podstawiamy nazwę portu: COM1, COM2, COM3, COM4, itp.
Jeżeli wystąpi jakiś błąd, to sprawdzamy, jaki. Najważniejsze kody błędu to:
- 2 - port nie istnieje
- 5 - port jest już używany przez inny program
Zamknięcie portu
Po zabawie musimy zamknąć port: ```delphi procedure ClosePort; begin CloseHandle (hPort); end; ```Wyjścia
Do wyjść dobieramy się następującą funkcją: ```delphi EscapeCommFunction (hPort, kod); ``` Jako kod podajemy stałą złożoną z dwóch słów: SET lub CLR oraz RTS, DTR, BREAK. W efekcie dostajemy 6 zmiennych: * SETRTS - ustawiamy stan wysoki na linii RTS * CLRRTS - ustawiamy stan niski na linii RTS * SETDTR - ustawiamy stan wysoki na linii DTR * CLRDTR - ustawiamy stan niski na linii DTR * SETBREAK - ustawiamy stan wysoki na linii TxD * CLRBREAK - ustawiamy stan niski na linii TxDWejścia
Wejścia czytamy funkcją: ```delphi GetCommModemStatus (hPort, zmienna_typu_cardinal) ``` Następnie sprawdzamy w otrzymanej zmiennej bity: * jeżeli bit o wadze 128 jest ustawiony, to na linii DCD jest stan wysoki * jeżeli bit o wadze 64 jest ustawiony, to na linii RI jest stan wysoki * jeżeli bit o wadze 32 jest ustawiony, to na linii DSR jest stan wysoki * jeżeli bit o wadze 16 jest ustawiony, to na linii DTS jest stan wysokiBity tradycyjnie sprawdzamy operatorem AND.