Нужно найти COM порты и вывести их в список или выпадающий список, для дальнейшей работы с ними.
Для этого подходит ниже следующий код
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
. . .
cbComPort: TComboBox;
. . .
procedure FindComPorts();
var
i: integer;
FHandl:THandle;
DeviceName: array[0..127] of Char;
sCom: string;
begin {опрос существующих портов}
for i := 0 to 31 do {цикл опроса}
begin {пробуем получить дескриптор порта}
sCom := 'COM' + IntToStr(i + 1);
StrPCopy(DeviceName, sCom+':');
FHandl := CreateFile(DeviceName,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ, //0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if FHandl <> INVALID_HANDLE_VALUE then
begin {если порт есть то добавить в список}
cbComPort.Items.Add(sCom);
end;
CloseHandle(FHandl); {закрыть дескриптор}
end; // for
end;
Из кода видно, что по сути COM порт это ничто иное как файл, который надо открыть и прочитать, и если надо то записать в него данные.
У данного кода есть изъян, он не найдет COM порты которые уже чем-то заняты.


