Если вам нужно что-то РЕАЛЬНОЕ, то попробуйте это. Можете только добавить
проверку на ошибки.
<<Книги>> Serial Communications: A C++ Developer's Guide by Mark
Nelson, M&T Books.
Правда, по большей части это про DOS, а Windows посвящена только одна глава.
Проверьте это.
unit Comm;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Forms;
type
TCommEvent = procedure(Sender: TObject; Data: Char) ofobject;
TCommErrEvent = procedure(Sender: TObject; Error: Integer) ofobject;
TComm = class(TComponent)
private
Wnd: HWND;
DCB: TDCB;
CommID: Integer;
Buf: array[0..2048] of char;
NumChars: Integer;
FOnCommErr: TCommErrEvent;
FOnCommRecvd: TCommEvent;
procedure CommWndProc(varMessage: TMessage);
publicfunction Send(data: Char): Boolean;
function Connect: Boolean;
constructor Create(AOwner: TComponent); override;
destructor destroy; override;
publishedproperty OnCommErr: TCommErrEvent read FOnCommErr write FOnCommErr;
property OnCommRecvd: TCommEvent read FOnCommRecvd write FOnCommRecvd;
end;
procedureRegister;
implementationconstructor TComm.Create(AOwner: TComponent);
begininherited Create(AOwner);
Wnd := AllocateHwnd(CommWndProc);
end;
procedure TComm.CommWndProc(varMessage: TMessage);
var
Error, count: Integer;
Stat: TComStat;
beginifMessage.Msg = WM_COMMNOTIFY thenbeginMessage.Result := 0;
GetCommEventMask(CommId, $3FFF);
NumChars := ReadComm(CommID, @Buf, 2048);
Error := GetCommError(CommId, Stat);
if Error = 0 thenbeginif Assigned(FOnCommRecvd) thenbeginfor count := 0 to NumChars - 1 do
FOnCommRecvd(Self, Buf[count]);
end;
endelsebeginif Assigned(FOnCommErr) thenbegin
FOnCommErr(Self, Error);
end;
end;
end;
end;
function TComm.Send(data: Char): Boolean;
var
Error: Integer;
begin
Error := TransmitCommChar(CommId, data);
if Error < 0 then
Result := Falseelse
Result := True;
end;
function TComm.Connect: Boolean;
var
Config: array[0..20] of Char;
begin
CommId := OpenComm('COM2', 2048, 2048);
StrCopy(Config, 'com2:96,n,8,1'); {Здесь меняем настройки порта}
BuildCommDCB(Config, DCB);
DCB.ID := CommId;
SetCommState(DCB);
EnableCommNotification(CommID, Wnd, 1, -1);
SetCommEventMask(CommId, ev_RXChar);
Result := True;
end;
destructor TComm.destroy;
begin
CloseComm(CommID);
DeallocateHwnd(Wnd);
inherited destroy;
end;
procedureRegister;
begin
RegisterComponents('Samples', [TComm]);
end;
end.
Приведенный код - это компонент для сериальной связи на языке Delphi, использующий Windows API. Он позволяет установить соединение с портом последовательной связи, отправлять и получать данные, а также обрабатывать события, такие как ошибки и полученные данные.
Разбивка кода:
Unit Comm
Единица начинается с объявления трех типов событий: TCommEvent, TCommErrEvent и TComm. Эти события будут использоваться для уведомления компонента о входящих данных или ошибках.
Класс TComm объявляется, который наследуется от TComponent.
Он имеет несколько приватных полей:
Wnd: обработчик окна, которое будет получать уведомления от порта последовательной связи.
DCB: структура данных для настройки порта последовательной связи.
CommID: идентификатор порта последовательной связи.
Buf: массив символов для хранения полученных данных.
NumChars: целочисленное поле для отслеживания количества символов в буфере.
Он имеет два свойства событий: OnCommErr и OnCommRecvd, которые позволяют присвоить процедуры, которые будут вызываться при ошибке или получении данных соответственно.
Implementation
Конструктор Create(AOwner: TComponent) выделяет новый обработчик окна и настраивает компонент.
Процедура CommWndProc(Var Message: TMessage) отвечает за обрабатывание сообщений, отправленных портом последовательной связи. Она проверяет, является ли сообщение уведомлением от порта последовательной связи, и если да, то обновляет буфер полученными данными или обрабатывает ошибки.
Функция Send(data: Char): Boolean отправляет одиночный символ по порту последовательной связи и возвращает, успешна ли операция.
Функция Connect: Boolean устанавливает соединение с портом последовательной связи 'COM2' с настройками по умолчанию (скорость 9600, 8-битное данные, без паритета, 1 стоп-бит). Она также настраивает уведомление о полученных данных.
Эта процедура регистрирует компонент TComm в категории 'Samples' панели компонентов Delphi.
Приведенный код хорошо структурирован и соблюдает стандартные практики программирования на языке Delphi. Однако, компонент не обрабатывает разрыв соединения или ошибки, которые могут возникнуть при коммуникации.
Если вы хотите улучшить этот код, вот несколько предложений:
Рассмотрите добавление обработки ошибок для функции Connect для обеспечения возможности восстановления компонента после сбоя соединения.
Реализуйте механизм обрабатывания разрывов соединения и повторного установления соединения, когда это необходимо.
Вы можете также добавить более свойств или методов для настройки параметров коммуникации (например, скорость, количество бит данных, паритет) или для отправки/получения больших блоков данных.
В целом, этот код предоставляет-solid основу для создания компонента сериальной связи в Delphi.
В статье рассмотрено создание класса для работы с последовательными портами в Windows, который позволяет отправлять и получать данные через COM-порт.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.