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

解决方案 »

  1.   

    读取注册表  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;
      

  2.   

    枚举系统中的串口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;
      

  3.   

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