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

Пример программирования com портов

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

Пример программирования com портов


unit TestRosh;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
  Panel1: TPanel;
  Label1: TLabel;
  PortCombo: TComboBox;
  Label2: TLabel;
  BaudCombo: TComboBox;
  Label3: TLabel;
  ByteSizeCombo: TComboBox;
  Label4: TLabel;
  ParityCombo: TComboBox;
  Label5: TLabel;
  StopBitsCombo: TComboBox;
  Label6: TLabel;
  Memo1: TMemo;
  Edit1: TEdit;
  Button1: TButton;
  Memo2: TMemo;
  Edit2: TEdit;
  Label7: TLabel;
  Button2: TButton;
  Label8: TLabel;
  Edit3: TEdit;
  procedure Button1Click(Sender: TObject);
  procedure Memo2Change(Sender: TObject);
  procedure Memo1Change(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure PortComboChange(Sender: TObject);
  procedure FormShow(Sender: TObject);
  procedure Memo1DblClick(Sender: TObject);
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  Registry;

var
  hPort: THandle;

procedure TForm1.Memo1Change(Sender: TObject);
var
  i: Integer;
begin
  Edit1.Text := '';
  for i := 1 to Length(Memo1.Text) do
    Edit1.Text := Edit1.Text + Format('%x', [Ord(Memo1.Text[i])]) + ' '
end;

procedure TForm1.Memo2Change(Sender: TObject);
var
  i: Integer;
begin
  Edit2.Text := '';
  for i := 1 to Length(Memo2.Text) do
    Edit2.Text := Edit2.Text + Format('%x', [Ord(Memo2.Text[i])]) + ' '
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S, D: array[0..127] of Char;
  actual_bytes: Integer;
  DCB: TDCB;
begin

  FillChar(S, 128, #0);
  FillChar(D, 128, #0);

  DCB.DCBlength := SizeOf(DCB);

  if not GetCommState(hPort, DCB) then
  begin
    ShowMessage('Can''t get port state: ' + IntToStr(GetLastError));
    Exit;
  end;

  try
    DCB.BaudRate := StrToInt(BaudCombo.Text);
  except
    BaudCombo.Text := IntToStr(DCB.BaudRate);
  end;

  try
    DCB.ByteSize := StrToInt(ByteSizeCombo.Text);
  except
    ByteSizeCombo.Text := IntToStr(DCB.ByteSize);
  end;

  if ParityCombo.ItemIndex > -1 then
    DCB.Parity := ParityCombo.ItemIndex
  else
    ParityCombo.ItemIndex := DCB.Parity;

  if StopBitsCombo.ItemIndex > -1 then
    DCB.StopBits := StopBitsCombo.ItemIndex
  else
    StopBitsCombo.ItemIndex := DCB.StopBits;

  if not SetCommState(hPort, DCB) then
  begin
    ShowMessage('Can''t set new port settings: ' + IntToStr(GetLastError));
    Exit;
  end;

  PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);

  StrPCopy(S, Memo1.Text);

  if not WriteFile(hPort, S, StrLen(S), actual_bytes, nil) then
  begin
    ShowMessage('Can''t write to port: ' + IntToStr(GetLastError));
    Exit;
  end;

  if not ReadFile(hPort, D, StrToInt(Edit3.Text), actual_bytes, nil) then
    ShowMessage('Can''t read from port: ' + IntToStr(GetLastError))
  else
    ShowMessage('Read ' + IntToStr(actual_bytes) + ' bytes');
  Memo2.Text := D;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    OpenKey('Shkila', True);
    WriteString('Port', PortCombo.Text);
    WriteString('Baud Rate', BaudCombo.Text);
    WriteString('Byte Size', ByteSizeCombo.Text);
    WriteString('Parity', IntToStr(ParityCombo.ItemIndex));
    WriteString('Stop Bits', IntToStr(StopBitsCombo.ItemIndex));
    Destroy;
  end;
  if not CloseHandle(hPort) then
  begin
    ShowMessage('Can''t close port: ' + IntToStr(GetLastError));
    Exit;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  hPort := CreateFile(PChar(PortCombo.Text),
  GENERIC_READ + GENERIC_WRITE,
  0,
  nil,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  0);

  if hPort = INVALID_HANDLE_VALUE then
    ShowMessage('Can''t open ' + PortCombo.Text + ': ' + IntToStr(GetLastError))
  else
    Button2.Hide;
end;

procedure TForm1.PortComboChange(Sender: TObject);
begin
  FormDestroy(Sender);
  Button2.Show;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    OpenKey('Shkila', True);
    PortCombo.Text := ReadString('Port');
    BaudCombo.Text := ReadString('Baud Rate');
    ByteSizeCombo.Text := ReadString('Byte Size');
    ParityCombo.ItemIndex := StrToInt(ReadString('Parity'));
    StopBitsCombo.ItemIndex := StrToInt(ReadString('Stop Bits'));
    Destroy;
  end;
end;

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
  Edit1.Text := '';
  Edit2.Text := '';
end;

end.

Программа на Delphi, которая демонстрирует работу с портами последовательной связи (COM-портами) в Windows. Программа создает форму с различными компонентами для настройки порта последовательной связи, отправки и приема данных, а также хранения настроек.

Компоненты формы

Программа создает компонент TForm1 с другими компонентами:

  • Panel1, Label1 до Label6: Используются для отображения макета формы.
  • PortCombo: Комбобокс для выбора порта последовательной связи.
  • BaudCombo, ByteSizeCombo, ParityCombo и StopBitsCombo: Комбобоксы для настройки частоты передачи, размера байта, паритета и остановки бит.
  • Memo1 и Memo2: Текстовые поля для отображения входящих и исходящих данных.
  • Edit1 и Edit2: Поле ввода для ввода данных, которые будут отправлены через портал последовательной связи.
  • Button1 и Button2: Кнопки для отправки и приема данных.

События формы

Программа определяет несколько обработчиков событий для компонентов формы:

  • Button1Click: Отправляет данные через портал последовательной связи, используя настройки, заданные в комбобоксах.
  • Memo2Change: Обновляет Edit2 с полученными данными.
  • Memo1Change: Обновляет Edit1 с отправленными данными.
  • FormDestroy: Хранит настройки формы в реестре Windows при закрытии программы.
  • Button2Click: Открывает выбранный портал последовательной связи и настраивает форму для отправки и приема данных.
  • PortComboChange: Хранит новый выбор порта в реестре Windows и отображает или скрывает кнопки соответственно.

Операции с портами последовательной связи

Программа выполняет несколько операций с портами последовательной связи:

  • GetCommState: Получает текущие настройки порта последовательной связи.
  • SetCommState: Настраивает порт последовательной связи с указанными настройками.
  • PurgeComm: Очищает любые pending данные в буферах порта последовательной связи.
  • WriteFile: Отправляет данные через порт последовательной связи.
  • ReadFile: Читает данные из порта последовательной связи.

Операции с реестром

Программа хранит и считывает настройки в реестре Windows с помощью компонента TRegistry:

  • OpenKey: Открывает ключ в реестре.
  • ReadString: Читает строковое значение из реестра.
  • WriteString: Записывает строковое значение в реестр.

В целом, эта программа демонстрирует работу с портами последовательной связи в Delphi и предоставляет основу для создания более сложных приложений по обмену данными.

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


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

Получайте свежие новости и обновления по 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:16:04/0.0061910152435303/1