Delphi FAQ

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ą http://4programmers.net/Delph[...]ga_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ż

FAQ

0 komentarzy