admin

[系统应用] Delphi 枚举串口 com口,连接测试com口

Delphi 枚举串口有主要有两个办法:

1,通过循环尝试打开某端口,然后通过函数返回值来判断该端口是否可用。主要可以用 createfile 函数来操作

var

m_hComm : Thandle;

i : integer;

begin

for i := 1 to 99 do

begin

m_hComm   :=   CreateFile( pchar('COM' + inttostr(i)),

          GENERIC_READ or GENERIC_WRITE,

          0, nil, OPEN_EXISTING,

          FILE_FLAG_OVERLAPPED,

          0);

if (m_hcomm <> INVALID_HANDLE_VALUE) then

begin

  cbchuan.Items.Add('COM' + inttostr(i));

  closehandle(m_hcomm);

end;

end;

end;

当然你也可以使用 MsComm 控件,然后通过异常捕获来判断。

var 

        i:integer; 

        ComName:String; 

begin 

        for   i   :=   1   to   16   do                                                                   

        begin 

              try                                                                                                                                                             

                        MSComm.CommPort:=i; 

                        MSComm.PortOpen:=true; 

                        sleep(30); 

                        MSComm.PortOpen:=false; 

                        ComName:= 'COM '+IntToStr(i); 

                        RadioGroup1.Items.Add(ComName); 

              except 

                    continue; 

              end; 

        end; 

end; 


2,通过读取注册表来获取,串口信息都是保存在注册表的这个位置 

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 具体代码如下:

 var   

      reg   :   TRegistry;   

      ts   :   TStrings;   

      i   :   integer;   

      sName,sPort:string;   

      slList:TStringList;   

  begin   

      reg   :=   TRegistry.Create;   

      ts   :=   TStringList.Create;   

      slList:=TStringList.Create;   

      try   

          reg.RootKey   :=   HKEY_LOCAL_MACHINE;   

          reg.OpenKey('hardware\devicemap\serialcomm',false);   

          reg.GetValueNames(ts);   

    

          slList.Sorted:=true;   

    

          for   i   :=   0   to   ts.Count   -1   do   begin   

              sName:=LowerCase(Trim(ts.Strings[i]));   

              //得到串口名称   

              sPort   :=   UpperCase(Trim(reg.ReadString(sName)));   

              if   Copy(sPort,1,3)   <>   'COM'   then   Continue;   

              sPort:=Copy(sPort,4,Length(sPort));   

              sPort:=FormatFloat('000',StrToInt(sPort));   

              slList.Add(sPort);   

          end;   

    

          slPort.Clear;   

          for   i:=0   to   slList.Count-1   do   

              slPort.Add('COM'+IntToStr(StrToInt(slList.Strings[i])));   

      finally   

          ts.Free;   

          reg.CloseKey;   

          reg.free;   

      end; 


#1楼
发帖时间:15天前   |   查看数:0   |   回复数:0
游客组