Приветствую Вас Гость | RSS

Меню сайта

Реклама

Категории раздела
CD-ROM [11]
DLL и PlugIns [75]
Help файлы [20]
INI файлы [16]
RS232 [2]
Активные директории [1]
Директории [0]
Диски [0]
Корзина [5]
Порты [26]
Ресурсы [0]
Файлы [0]
Форматы файлов [15]
Ярлыки [0]

Наш опрос
Какие компоненты добавлять больше?
Всего ответов: 49

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Файловая система » Порты

Работа с последовательными портами 2

Если вам нужно что-то РЕАЛЬНОЕ, то попробуйте это. Можете только добавить проверку на ошибки.

<<Книги>> Serial Communications: A C++ Developer's Guide by Mark Nelson, M&T Books.

Правда, по большей части это про DOS, а Windows посвящена только одна глава. Проверьте это.


unit Comm;
interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Forms;

type
TCommEvent = procedure(Sender: TObject; Data: Char) of object;
TCommErrEvent = procedure(Sender: TObject; Error: Integer) of object;
TComm = class(TComponent)
private
Wnd: HWND;
DCB: TDCB;
CommID: Integer;
Buf: array[0..2048] of char;
NumChars: Integer;
FOnCommErr: TCommErrEvent;
FOnCommRecvd: TCommEvent;
procedure CommWndProc(var Message: TMessage);
public
function Send(data: Char): Boolean;
function Connect: Boolean;
constructor Create(AOwner: TComponent); override;
destructor destroy; override;
published
property OnCommErr: TCommErrEvent read FOnCommErr write FOnCommErr;
property OnCommRecvd: TCommEvent read FOnCommRecvd write FOnCommRecvd;
end;
procedure Register;
implementation

constructor TComm.Create(AOwner: TComponent);
begin

inherited Create(AOwner);
Wnd := AllocateHwnd(CommWndProc);
end;

procedure TComm.CommWndProc(var Message: TMessage);
var

Error, count: Integer;
Stat: TComStat;
begin

if Message.Msg = WM_COMMNOTIFY then
begin
Message.Result := 0;
GetCommEventMask(CommId, $3FFF);
NumChars := ReadComm(CommID, @Buf, 2048);
Error := GetCommError(CommId, Stat);
if Error = 0 then
begin
if Assigned(FOnCommRecvd) then
begin
for count := 0 to NumChars - 1 do
FOnCommRecvd(Self, Buf[count]);
end;
end
else
begin
if Assigned(FOnCommErr) then
begin
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 := False
else
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;

procedure Register;
begin

RegisterComponents('Samples', [TComm]);
end;
end.
Категория: Порты | Добавил: Angel (07.07.2008)
Просмотров: 440 | Рейтинг: 0.0/0
  Delphi Lab   Главная   Регистрация   Вход  
Интересная Цитата

Поиск

Магазин


Copyright MyCorp © 2025 Хостинг от uCoz