Тема: Com-порт
Показать сообщение отдельно
  #13  
Старый 04.10.2011, 15:35
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 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-порта (полярность неважна - все равно обе будут ).
Ответить с цитированием