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 TxD

Wejś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 wysoki

Bity tradycyjnie sprawdzamy operatorem AND.

Patrz również

* http://4programmers.net/WinAPI/CreateFile - opis funkcji CreateFile * http://4programmers.net/Delphi/Artykuły/Obsługa_portu_com_z_poziomu_Delphi - rozbudowany artykuł o wszelkich możliwych sposobach wykorzystania właściwości portu COM

0 komentarzy