Ниже представлен класс для работы с COM-портом.  Класс выдернут из контекста, так что не ручаюсь в компиляции с первого раза, однако все функции работы с COM очевидны.

 

Code:

unit Unit1;

 

interface

 

uses

Windows;

 

type

TComPort = class

private

   hFile: THandle;

public

   constructor Create;

   destructor Destroy; override;

   function InitCom(BaudRate, PortNo: Integer; Parity: Char;

     CommTimeOuts: TCommTimeouts): Boolean;

   procedure CloseCom;

   function ReceiveCom(var Buffer; Size: DWORD): Integer;

   function SendCom(var Buffer; Size: DWORD): Integer;

   function ClearInputCom: Boolean;

end;

 

implementation

 

uses

SysUtils;

 

constructor TComPort.Create;

begin

inherited;

CloseCom;

end;

 

destructor TComPort.Destroy;

begin

CloseCom;

inherited;

end;

 

function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;

CommTimeOuts: TCommTimeouts): Boolean;

var

FileName: string;

DCB: TDCB;

PortParam: string;

begin

result := FALSE;

FileName := 'Com' + IntToStr(PortNo); {имя файла}

hFile := CreateFile(PChar(FileName),

   GENERIC_READ or GENERIC_WRITE, 0, nil,

   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

if hFile = INVALID_HANDLE_VALUE then

   exit;

 

//установка требуемых параметров

GetCommState(hFile, DCB); //чтение текущих параметров порта

PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity +

   ' data=8 stop=1 ' +

   'octs=off';

if BuildCommDCB(PChar(PortParam), DCB) then

begin

   result := SetCommState(hFile, DCB) and

     SetCommTimeouts(hFile, CommTimeOuts);

end;

if not result then

   CloseCom;

end;

 

procedure TComPort.CloseCom;

begin

if hFile < > INVALID_HANDLE_VALUE then

   CloseHandle(hFile);

hFile := INVALID_HANDLE_VALUE;

end;

 

function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;

var

Received: DWORD;

begin

if hFile = INVALID_HANDLE_VALUE then

   raise Exception.Create('Не открыта запись в Com порт');

if ReadFile(hFile, Buffer, Size, Received, nil) then

begin

   Result := Received;

end

else

   raise Exception.Create('Ошибка приема данных: ' + IntToStr(GetLastError));

end;

 

function TComPort.SendCom(var Buffer; Size: DWORD): Integer;

var

Sended: DWORD;

begin

if hFile = INVALID_HANDLE_VALUE then

   raise Exception.Create('Не открыта запись в Com порт');

if WriteFile(hFile, Buffer, Size, Sended, nil) then

begin

   Result := Sended;

end

else

   raise Exception.Create('Ошибка передачи данных: ' + IntToStr(GetLastError));

end;

 

function TComPort.ClearInputCom: Boolean;

begin

if hFile = INVALID_HANDLE_VALUE then

   raise Exception.Create('Не открыта запись в Com порт');

Result := PurgeComm(hFile, PURGE_RXCLEAR);

end;

 

end.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить