插上多串口卡后,如何检测系统可用的串口个数?(100分)

  • 主题发起人 主题发起人 党sir
  • 开始时间 开始时间

党sir

Unregistered / Unconfirmed
GUEST, unregistred user!
原来的程序,没有考虑开机检测可用的串口,只列出了常用的com1 com2,可是用户用的是多串口卡,名称可能是com8.com9等,我想应该有个方法检测电脑中可用的串口列表。dx们,帮一把。(龚建平的串口调试工具就能够自动检测出来)
 
function CheckCommPortAvailable(CommPort : String) : Boolean;
var
hCommFile : THandle;
begin
Result := False;
hCommFile := CreateFile( PChar(CommPort),
GENERIC_READ or GENERIC_WRITE,
0, {not shared}
nil, {no security ??}
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0 {template} );
if hCommFile <> INVALID_HANDLE_VALUE then
begin
CloseHandle(hCommFile);
Result := True;
end;
end;

var
i : Integer;
begin
for i := 1 to 20 do
begin
if CheckCommPortAvailable('COM'+inttostr(i)) then listbox1.items.add('COM'+inttostr(i));
end;
end;
 
通用串口检测模块,用Windows的API函数EnumPorts实现。
能够检测到系统中全部COM口,如COM1,COM2,...,COM256

// 枚举本机上全部COM口,结果在Ports内
procedure EnumComPorts(Ports: TStrings);
var
BytesNeeded, Returned, I: DWORD;
Success: Boolean;
PortsPtr: Pointer;
InfoPtr: PPortInfo1;
TempStr: string;
begin
Success := EnumPorts(
nil,
1,
nil,
0,
BytesNeeded,
Returned);

if (not Success) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem(PortsPtr, BytesNeeded);
try
Success := EnumPorts(
nil,
1,
PortsPtr,
BytesNeeded,
BytesNeeded,
Returned);

for I := 0 to Returned - 1 do
begin
InfoPtr := PPortInfo1(DWORD(PortsPtr) + I * SizeOf(TPortInfo1));
TempStr := InfoPtr^.pName;
if Copy(TempStr, 1, 3) = 'COM' then
Ports.Add(Copy(TempStr, 1, Length(TempStr) - 1));
end;
finally
FreeMem(PortsPtr);
end;
end;

if not Success then
raise Exception.Create('枚举COM口失败', GetLastError);
end;
 
 
用CreateFile方法不可靠,如果端口已被其它应用占用,你将测不到。
 
apw PPortInfo1;是什么类型?编译通不过,救命呀 apw
 
见VCL Source, 
WinSpool.pas

在Uses内加Windows即可。 
 
估计你还得结合CreateFile来使用。
 
检查注册表吧
 
很想知道答案。
 
后退
顶部