读书人

如果列出电脑存在的串口?解决思路

发布时间: 2012-02-22 19:36:55 作者: rapoo

如果列出电脑存在的串口?
近口用到usb转com口的连接的设备,需要程序自动判断连接,由于每台机上com口号不同,能否自动列出电脑上所有的com口号?

[解决办法]
找找注册表看看
[解决办法]
读取注册表

Delphi(Pascal) code
  reg := TRegistry.Create;  try    reg.RootKey := HKEY_LOCAL_MACHINE;    reg.OpenKey('hardware\devicemap\serialcomm', False);    st := TstringList.Create;    try      reg.GetValueNames(st);      for i := 0 to st.Count - 1 do        cbbComName.Items.Add(reg.Readstring(st.strings[i]));      cbbComName.ItemIndex := 0;    finally      st.Free;    end;    reg.CloseKey;  finally    reg.Free;  end;
[解决办法]
枚举系统中的串口

procedure EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'HARDWARE\DEVICEMAP\SERIALCOMM',
0,
KEY_READ,
KeyHandle);

if ErrCode <> ERROR_SUCCESS then
raise Exception.Create('枚举串口错误');

TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(
KeyHandle,
Index,
PChar(ValueName),
Cardinal(ValueLen),
nil,
@ValueType,
PByte(PChar(Data)),
@DataLen);

if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
raise Exception.Create('系统找不到串口');

until (ErrCode <> ERROR_SUCCESS) ;

TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;
end;
[解决办法]
探讨
枚举系统中的串口

procedure EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
……

[解决办法]
除了查询注册表,还有一个方法,就是使用MSComm控件,从1 到256一个一个的打开,串口,如果不报错,那么该串口存在,如果报错,那么该编号串口不存在。
[解决办法]
探讨
读取注册表

Delphi(Pascal) code

reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm', False);
st := TstringList.Create;
……

读书人网 >.NET

热点推荐