Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

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

Delphi , Файловая система , Порты

Работа с последовательными портами 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.

Приведенный код - это компонент для сериальной связи на языке 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 стоп-бит). Она также настраивает уведомление о полученных данных.
  • Деструктор destroy освобождает ресурсы, выделенные компонентом.

Register procedure

  • Эта процедура регистрирует компонент TComm в категории 'Samples' панели компонентов Delphi.

Приведенный код хорошо структурирован и соблюдает стандартные практики программирования на языке Delphi. Однако, компонент не обрабатывает разрыв соединения или ошибки, которые могут возникнуть при коммуникации. Если вы хотите улучшить этот код, вот несколько предложений:

  • Рассмотрите добавление обработки ошибок для функции Connect для обеспечения возможности восстановления компонента после сбоя соединения.
  • Реализуйте механизм обрабатывания разрывов соединения и повторного установления соединения, когда это необходимо.
  • Вы можете также добавить более свойств или методов для настройки параметров коммуникации (например, скорость, количество бит данных, паритет) или для отправки/получения больших блоков данных.

В целом, этот код предоставляет-solid основу для создания компонента сериальной связи в Delphi.

В статье рассмотрено создание класса для работы с последовательными портами в Windows, который позволяет отправлять и получать данные через COM-порт.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Порты ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-07-27 14:20:34/0.0079801082611084/2