Посылать и считывать данные с COM порта, а также менять параметры (биты данных, четность)

Советы » Порты » Посылать и считывать данные с COM порта, а также менять параметры (биты данных, четность)

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

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

.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com