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

Определить, доступен ли COM порт

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

Определить, доступен ли COM порт

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  This tip uses the API of Windows to determine 
  if a this available certain COM. 
  Port: COM1, COM2, COM3... 
}

 function ComPortAvailable(Port: PChar): Boolean;
 var
   DeviceName: array[0..80] of Char;
   ComFile: THandle;
 begin
   StrPCopy(DeviceName, Port);

   ComFile := CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil,
     OPEN_EXISTING,
     FILE_ATTRIBUTE_NORMAL, 0);

   Result := ComFile <> INVALID_HANDLE_VALUE;
   CloseHandle(ComFile);
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   if ComPortAvailable('COM1:') then
     ShowMessage('Port available')
   else
     ShowMessage('Port not available');
 end;

Программный код на Delphi, предназначенный для проверки доступности конкретного порта COM (в этом случае 'COM1:'). Код разбивается на функцию ComPortAvailable и процедуру TForm1.Button1Click.

Функция ComPortAvailable

Эта функция принимает строковый параметр Port, представляющий имя порта COM (например, 'COM1:', 'COM2:', и т.д.). Она возвращает булевое значение, указывающее доступен ли указанный порт COM.

Функция работает следующим образом:

  1. Копирует входной параметр Port в массив DeviceName с помощью StrPCopy.
  2. Создает файловый дескриптор для указанного порта COM с помощью CreateFile. Флаги GENERIC_READ и GENERIC_WRITE позволяют чтение и запись в порт соответственно.
  3. Проверяет, является ли созданный файловый дескриптор валидным, сравнивая его с INVALID_HANDLE_VALUE. Если он не является недопустимым (т.е., валидным), функция возвращает True, указывая, что порт COM доступен.
  4. Закрывает файловый дескриптор с помощью CloseHandle.

Процедура TForm1.Button1Click

Эта процедура вызывается при клике кнопки с надписью 'Button1'. Она вызывает функцию ComPortAvailable с параметром 'COM1:', представляющим порт COM для проверки.

Если возвращенное значение равно True, она отображает сообщение с текстом "Port available". В противном случае, она отображает сообщение с текстом "Port not available".

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

Вместо использования функции CreateFile и проверки недопустимых значений дескриптора файлового handles, можно использовать Windows API-функцию GetLastError, чтобы проверить, возникло ли ошибку при создании файла. Это может быть более надежным и понятным подходом.

Обновленная реализация:

function ComPortAvailable(Port: PChar): Boolean;
var
  DeviceName: array[0..80] of Char;
begin
  StrPCopy(DeviceName, Port);

  var Handle = CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if GetLastError() <> 0 then
  begin
    Result := False; // COM port is not available
  end
  else
  begin
    CloseHandle(Handle);
    Result := True; // COM port is available
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ComPortAvailable('COM1:') then
    ShowMessage('Port available')
  else
    ShowMessage('Port not available');
end;

Используя GetLastError для проверки ошибок, можно упростить код и сделать его более читаемым.

Определить доступность конкретного COM-порта на компьютере с помощью функции ComPortAvailable, разработанной на языке Delphi.


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

Получайте свежие новости и обновления по 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 20:12:49/0.0116868019104/0