Если вам нужно что-то РЕАЛЬНОЕ, то попробуйте это. Можете только добавить
проверку на ошибки.
<<Книги>> 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.
Статья Работа с последовательными портами 2 раздела Файловая система Порты может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.