Programowanie w języku Delphi » FAQ

Jak obsłużyć porty pod Windowsami NT

  • 2007-02-18 22:14
  • 0 komentarzy
  • 692 odsłony
  • Oceń ten tekst jako pierwszy
Uwaga: artykuł dotyczy obsługi linii sterujących portu COM. Obsługa transmisji to nieco inna sprawa (update coming soon :-)).
Artykuł jest uproszczoną wersją http://4programmers.net/Delphi[...]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:
procedure ClosePort;
begin
 CloseHandle (hPort);
end;


Wyjścia


Do wyjść dobieramy się następującą funkcją:
 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ą:
 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ż