04.10.2011, 15:35
|
Прохожий
|
|
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
|
|
Если нужно просто светодиодом поморгать, компоненты не нужны - и через WinApi все очень просто выходит. Вот код:
Код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
COMHandle : cardinal;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
// Эта функция записывает в биты X, заданные в Mask значение Value.
// т.е. если X = bxxxxxxxx; Mask = b00011100; Value = b00000010;
// Значение X после выполнения функции станет bxxx010xx;
procedure SetBits(var X:integer; Mask,Value:integer);
var temp:integer;
begin
if Mask=0 then exit;
temp:=1;
while (Mask and temp)=0 do begin
temp := temp shl 1;
Value := Value shl 1;
end;
X := X and (not Mask);
X := X or (Value and Mask);
end;
procedure ClosePort(var Handle : cardinal);
begin
if Handle = INVALID_HANDLE_VALUE then exit;
CloseHandle(Handle);
Handle := INVALID_HANDLE_VALUE;
end;
function OpenPort(const COMName:string) : cardinal;
var DCB:_DCB;
begin
// Открытие порта
Result := CreateFile(
PChar(ComName),
GENERIC_READ+GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0
);
// Если удалось открыть порт - конфигурируем его
if Result=INVALID_HANDLE_VALUE then exit;
try
// Запрещаем автоматическое управление линией DTR -> будем управлять вручную
GetCommState(Result,DCB);
SetBits(DCB.Flags,(3 shl 4),DTR_CONTROL_DISABLE);
SetCommState(Result,DCB);
except
ClosePort(Result);
end;
end;
// Управление линией DTR (нога 4 на разъеме DB9 COM порта)
function Set_DTR_Pin(Handle:cardinal; State:boolean):boolean;
const States : array [False..True] of cardinal = (CLRDTR,SETDTR);
begin
Result := false;
if Handle=INVALID_HANDLE_VALUE then exit;
Result := EscapeCommFunction(Handle,States[State]); // Управление линией DTR
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Set_DTR_Pin(COMHandle,true);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Set_DTR_Pin(COMHandle,false);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
COMHandle := OpenPort('COM1');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClosePort(COMHandle);
end;
end.
Приблуду со светодиодом подключать к 4 и 5 ногам COM-порта (полярность неважна - все равно обе будут ).
|