【问题标题】:Enumerating a List of systems Com Ports in Delphi在 Delphi 中枚举系统 Com 端口列表
【发布时间】:2009-03-05 00:41:59
【问题描述】:

目标:我希望能够在 Delphi 中列出系统上可用的 COM 端口。

家庭作业: 我已经阅读了this SO thread on enumifying the LPT ports of a system using the registry。我还发现 COM 端口在 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 的注册表中列出,但在 same thread 中发现未回答的手势,这在不同的机器和不同版本的 Windows 上可能不可靠。

我还发现文章引用了 QueryDosDevice() 的使用,但在尝试 this sample code 时,我发现它似乎根本没有列出任何 COM 端口。

问题:列出 Windows 机器上的 COM 端口最可靠的方法是什么(跨未知的 Windows 版本)?

【问题讨论】:

    标签: delphi winapi registry serial-port


    【解决方案1】:

    DEVICEMAP\SERIALCOMM 适用于所有 NT 版本。您可能需要在 DYN_DATA 下查看 Win9x。

    如果您需要运行时可靠性,请使用 this method

    【讨论】:

    • 这看起来是最好的方法,但如果我正确阅读文档,它是在启动时创建的。这是否意味着启动后添加的串行设备将不存在?
    • 可能不会。但由于该设备实际上使用 USB 转串口桥接器,因此可能会让一些习惯于在启动后插入 USB 设备的人感到困惑。
    • 我添加了一种可以处理运行时的替代方法。
    • 与下面发布的@lakshmanaraj 相同。我猜之前一定有人翻译过这个供 Delphi 使用?
    • 我在将 codeproject.com 示例与 Cygwin (ANSI C) 一起使用时遇到了很多麻烦,最后我创建了一个基于 GetDefaultCommConfig() 的简单函数。见stackoverflow.com/questions/1205383/…
    【解决方案2】:

    请浏览用 C++ 编写的 URL

    http://www.codeproject.com/KB/system/serial_portsenum_fifo.aspx

    同样的方法也可以在 delphi 中实现.. 或者有人可以在 SO 中为您转换..

    这将适用于所有 windows 版本,因为这是从适用于所有 windows 版本的设备管理器原理工作的。

    【讨论】:

    【解决方案3】:

    这是 LINUX 的代码,不是 WINDOWS 的代码......

    function GetSerialPortNames: string;
    var
      Index: Integer;
      Data: string;
      TmpPorts: String;
      sr : TSearchRec;
    begin
      try
        TmpPorts := '';
        if FindFirst('/dev/ttyS*', $FFFFFFFF, sr) = 0 then
        begin
          repeat
            if (sr.Attr and $FFFFFFFF) = Sr.Attr then
            begin
              data := sr.Name;
              index := length(data);
              while (index > 1) and (data[index] <> '/') do
                index := index - 1;
              TmpPorts := TmpPorts + ' ' + copy(data, 1, index + 1);
            end;
          until FindNext(sr) <> 0;
        end;
        FindClose(sr);
      finally
        Result:=TmpPorts;
      end;
    end;
    

    【讨论】:

    • 谢谢,但这在目标机器上给了我一个空字符串。
    • 你知道你可以编辑你的答案并修正它们,这样它们就不会错了,对吧?或者删除它们,以免人们通过尝试发现它们是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多