procedure TForm1.Button1Click(Sender: TObject);
var
CommPort: string;
hCommFile: THandle;
Buffer: PCommConfig;
size: DWORD;
begin
CommPort := 'COM1';
{Открываем Com-порт}
hCommFile := CreateFile(PChar(CommPort),
GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCommFile = INVALID_HANDLE_VALUE thenbegin
ShowMessage('Unable to open ' + CommPort);
exit;
end;
{Выделяем временный буфер}
GetMem(Buffer, sizeof(TCommConfig));
{Получаем размер структуры CommConfig}
size := 0;
GetCommConfig(hCommFile, Buffer^, size);
{Освобождаем временный буфер}
FreeMem(Buffer, sizeof(TCommConfig));
{Выделяем память для структуры CommConfig}
GetMem(Buffer, size);
GetCommConfig(hCommFile, Buffer^, size);
{Изменяем скорость передачи}
Buffer^.dcb.BaudRate := 1200;
{Устанавливаем новую конфигурацию для COM-порта}
SetCommConfig(hCommFile, Buffer^, size);
{Освобождаем буфер}
FreeMem(Buffer, size);
{Закрываем COM-порт}
CloseHandle(hCommFile);
end;
Перевод контента на русский язык:
Это процедура Delphi, которая настраивает конфигурацию COM-порта с помощью функций Windows API CreateFile, GetCommConfig и SetCommConfig для открытия, настройки и закрытия COM-порта.
Вот разбивка того, что код делает:
Он открывает COM-порт COM1 с помощью функции CreateFile, указывая режим как GENERIC_WRITE (чтение-запись доступа) и открывая существующий файл.
Если файл не может быть открыт, он отображает сообщение об ошибке и выходит из процедуры.
Он занимает временный буфер для хранения структуры настройки COM (TCommConfig) с помощью функции GetMem.
Он получает размер структуры TCommConfig вызовом функции GetCommConfig с нулевым указателем.
Он освобождает временный буфер и занимает новый буфер для хранения измененной настройки COM.
Он устанавливает скорость передачи данных COM-порта в 1200 бит/сек с помощью свойства Buffer^.dcb.BaudRate.
Он применяет новую настройку COM с помощью функции SetCommConfig, передавая handle, буфер и размер как аргументы.
Наконец, он освобождает измененный буфер и закрывает COM-порт с помощью функции CloseHandle.
Вот некоторые предложения по улучшению:
Вместо использования GetMem для выделения памятиconsider using the TMemoryStream class to create a stream-based memory allocation. Это может помочь с обработкой ошибок и управлением памятью.
Рассмотрите добавление более тщательной проверки и обработки ошибок, если COM-порт не настроен правильно или занят при попытке изменить его конфигурацию.
Вместо жесткого кодирования имени COM-порта ('COM1') как строкиconsider using an enum or a constant to define the port number. Это может сделать код более читаемым и поддерживаемым.
Рассмотрите добавление комментариев, чтобы объяснить, что каждый раздел кода делает.
Вот пример рефакторинга кода с использованием TMemoryStream:
procedureTForm1.Button1Click(Sender:TObject);varCommPort:TCommPort;Buffer:TMemoryStream;beginCommPort:='COM1';// Создаем память для хранения настройки COMBuffer:=TMemoryStream.Create;try// Открываем COM-портhCommFile:=CreateFile(PChar(CommPort),GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);ifhCommFile=INVALID_HANDLE_VALUEthenbeginShowMessage('Unable to open '+CommPort);exit;end;// Получаем текущую настройку COMBuffer.Position:=0;GetCommConfig(hCommFile,Buffer.Memory^,size);// Модифицируем скорость передачи данныхBuffer.Position:=4;// Пусть dcb находится в offset 4Buffer.WriteBuffer(sizeof(TDcb),1);// Устанавливаем новую настройку COMSetCommConfig(hCommFile,Buffer.Memory^,size);finally// Закрываем и освобождаем памятьFreeAndNil(Buffer);CloseHandle(hCommFile);end;end;
Обратите внимание, что это только пример и может требовать изменений в зависимости от вашей конкретной ситуации.
Статья описывает программный способ установки конфигурации COM-порта в Delphi, включая открытие порта, получение размера структуры CommConfig, изменение параметров передачи и установку новой конфигурации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.