【问题标题】:rxtx com portrxtx com 端口
【发布时间】:2009-05-19 19:41:37
【问题描述】:

我正在使用 rxtx api 通过 com 端口从 GPS 设备读取数据。现在,我通过读取配置文件并查找列出的端口来找到正确的 com 端口。我遇到的问题是,如果拔下设备,com 端口可能会改变,那么用户必须知道更改配置文件。我在 c# 中编写了一个与此类似的应用程序,并且能够列出 windows 设备名称而不是 com 端口,并且我循环浏览了 com 端口,直到设备名称与配置文件中的名称匹配。使用该方法,即使正在使用的 com 端口发生更改,配置文件中的任何内容也不必更改。有没有办法用 rxtx api 做到这一点?

提前致谢!

【问题讨论】:

    标签: java serial-port rxtx


    【解决方案1】:

    如果有人有兴趣...

    我在 C# 中创建了一个监视套接字的 Windows 服务。如果客户端连接到该套接字,则服务会收集端口名称和该端口上的设备 ID,并通过 com 端口以字符串形式发送数据,然后客户端可以解析字符串以获取所需的数据。

    在我的情况下,传递的字符串是: “ACPI \ PNP0501 * PNP0501,COM1,PCI \ VEN_8086&DEV_29B7&SUBSYS_02111028&REV_02 PCI \ VEN_8086&DEV_29B7&SUBSYS_02111028 PCI \ VEN_8086&DEV_29B7&CC_070002 PCI \ VEN_8086&DEV_29B7&CC_0700,COM3,USB \ Vid_067b&Pid_2303&Rev_0400 USB \ Vid_067b&Pid_2303,COM5” P>

    当我解析它时,我可以看到 ACPI\PNP0501 *PNP0501 是 COM 1 的设备 ID,COM​​3 有三个设备 ID,COM​​5 上有两个设备 ID。

    这可能不是处理这个问题的最佳方法,但它足以满足我的需求,它使我免于 JNI。 :)

    【讨论】:

      【解决方案2】:

      CommPortIdentifier.getPortIdentifiers 列出系统中可供 Javacomm API 使用的所有端口。遍历它们以找到您的设备连接到的端口。

      【讨论】:

      • 我已经这样做了,但它没有给我使用端口的设备的设备 ID,它只是返回每个端口的 ComPortIdentifier。使用它您可以获得端口名称(即 COM3)但不是设备 ID,因此我仍然需要知道我正在寻找的端口。
      • 你到底需要什么?从您的问题来看,您似乎想要枚举所有可用端口以找到您正在寻找的端口,这样您就不需要更改配置文件。这应该对你有所帮助——除非你问错了问题。 :)
      • 根据您的建议,如果设备在拔出并重新插入后获得新的 com 端口(这在我的系统中经常发生),我仍然需要更改配置文件。我在 C# 中的代码在 com 端口(不会更改)上查找设备名称,因此即使 com 端口发生更改,应用程序仍然可以找到正确的端口。希望这会更有意义。
      • 我还是不太明白你的问题。为什么名字很重要?您可以枚举所有端口。您正在寻找的港口就是其中之一!它将永远存在,它的名字完全无关紧要。此外,当您遍历所有可用端口时,您无需将端口名称存储在配置文件中。
      • 好的,这是一个真实的例子。我有一个 ID 为“USB\Vid_067b&Pid_2003”的设备,它位于 COM5 上。如果我按端口名称搜索,那么如果设备被拔出并重新插入并且端口更改为 COM6,那么我必须更改配置文件。但是,如果我可以搜索包含具有该 ID 的设备的任何端口,那么我不必关心它在哪个端口上。我可以滚动浏览每个端口,寻找具有永远不会更改的 id 的设备,因此我永远不必更改配置文件。
      【解决方案3】:

      如果您想在 COM 端口上获取与设备关联的名称(特别是如果安装了驱动程序来提供它),您将不得不使用一些可怕的 Java->Native 接口来进行交谈到收集此信息的 Windows API。 C# 很好,因为这些信息被收集并提供给您,但在 Java 中您必须执行此额外步骤。

      Windows Function Discovery 可能很有用。我不确定究竟是什么 API 提供了这个功能。

      【讨论】: