Нужно найти 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 порты которые уже чем-то заняты.