unit TestRosh;
interfaceuses
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);
ifnot GetCommState(hPort, DCB) thenbegin
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;
ifnot SetCommState(hPort, DCB) thenbegin
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);
ifnot WriteFile(hPort, S, StrLen(S), actual_bytes, nil) thenbegin
ShowMessage('Can''t write to port: ' + IntToStr(GetLastError));
Exit;
end;
ifnot 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);
beginwith TRegistry.Create dobegin
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;
ifnot CloseHandle(hPort) thenbegin
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);
beginwith TRegistry.Create dobegin
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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.