Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

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

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

Автор: Iouri

Ниже представлен класс для работы с 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.

Рецензия на предоставленный код для работы с портом COM:

Положительные стороны:

  1. Код структурирован и легко понятен.
  2. Он предлагает функции инициализации, отправки, приема и очистки ввода на порте COM.
  3. Обработка ошибок реализована с помощью Exception.Create и GetLastError.

Предложения:

  1. Организация кода: Рассмотрите возможность перемещения вызовов CreateFile, GetCommState, BuildCommDCB и SetCommState в отдельный метод для улучшения читаемости и поддержки кода.
  2. Обработка ошибок: Хотя обработка ошибок реализована, она может быть улучшена с помощью предоставления более конкретных сообщений об ошибках или механизмов журналирования для целей отладки.
  3. Безопасность типов: Код использует типы Integer и Char для параметров, которые вероятно будут использоваться для настроек порта COM (например, скорость передачи, паритет). Рассмотрите возможность использования более конкретных типов, таких как TCommBaudRate и TParity, если они доступны в Delphi.
  4. Стиль кода: Код использует обе записи camelCase и underscore для имен переменных. Рекомендуется использовать единый стиль названия переменных throughout код.

Альтернативное решение:

Вместо использования функций CreateFile, GetCommState, BuildCommDCB и SetCommState можно использовать компонент TSerialPort, предоставленный встроенной библиотекой Delphi для портов сериальной связи. Этот компонент предлагает более простой интерфейс для работы с портами COM.

Пример кода, использующий TSerialPort:

procedure TComPort.InitSerial(BaudRate: TCommBaudRate; Parity: TParity);
begin
  Serial := TSerialPort.Create;
  try
    Serial.Port := 'COM' + IntToStr(PortNo);
    Serial.BaudRate := BaudRate;
    Serial.Parity := Parity;
     // ... настройте другие параметры порта ...
  finally
    FreeAndNil(Serial);
  end;
end;

procedure TComPort.SendData(var Buffer; Size: DWORD);
begin
  if Assigned(Serial) then
    try
      Serial.Write(Buffer, Size);
    except
       // обработайте ошибку
    end;
end;

В этом примере TSerialPort используется для создания объекта порта сериальной связи с указанными настройками. Метод SendData отправляет данные с помощью метода Write компонента TSerialPort.

Обратите внимание, что использование TSerialPort может требовать дополнительных библиотек или компонентов для установки в вашем проекте Delphi.

Класс для работы с COM-портом позволяет послать и считывать данные, а также изменять параметры порта (биты данных, четность) на компьютере под управлением Windows 95.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-17 21:09:42/0.003899097442627/0