【问题标题】:Java Comm port on Windows - Automatic port detectionWindows 上的 Java Comm 端口 - 自动端口检测
【发布时间】:2015-08-28 12:56:57
【问题描述】:

我正在开发一个应用程序,该应用程序需要能够通过 Windows 操作系统上的串行通信与设备进行通信。该应用程序是用 Java 编写的。我正在使用 jSSC 库。 (Javax.comm 有问题,RxTx 不支持 Java 8,除了非官方更新)这些设备可以使用串行端口直接连接到 PC,或者使用 USB 到串行转换器。

我的问题: Windows 上的 COM 端口是动态的。这引发了定义要连接到哪个通信端口的问题。有没有办法自动确定要连接到哪个 COM 端口?

到目前为止,我能够提出的唯一解决方案包括扫描所有 com 端口以查找活动端口,保存此列表,然后要求用户插入设备并执行另一次扫描 - 然后额外的 COM 端口将要连接的那个。

或者,设备将响应特定的“识别”数据包:我可以打开每个 COM 端口并发送此数据包并评估响应。这可能会导致其他设备在短时间内被劫持,这并不理想。

【问题讨论】:

  • 我还没有看到一个好的自动检测方案。你永远不知道其他设备会如何反应,就像你提到的那样。如果您仅在 Windows 上运行,我建议在 .net 中使用可以捕获 USB 插入事件的帮助程序库。如果这是经典的 DB9,那我什么都没有。查看我的名为 Porty 的应用程序,它执行端口名称检测。您可能可以根据需要对其进行调整。 github.com/corytodd/porty
  • 谢谢!我查看了您的应用,看起来可能会有所帮助。

标签: java windows serial-port jssc


【解决方案1】:

为了动态检测端口,需要调用操作系统特定的函数。 SCM 库提供 API 用于动态检测端口。

try {
    scm.registerUSBHotPlugEventListener(this, PRODUCT_VID, PRODUCT_PID, null);
    if(scm.isUSBDevConnected(PRODUCT_VID, PRODUCT_PID, null)) {
        USBhotplugEventQueue.offer(SerialComUSB.DEV_ADDED);
    }
} catch (Exception e) {
    e.printStackTrace();
}

【讨论】:

  • 这仅适用于我认为的 USB 设备?我已成功说服参与该项目的大多数各方转向 USB 或 TCP/IP,但仍有一些人(并且可能会在相当长的一段时间内)坚持使用串行(直接 RS232)
  • 您可以使用 findDriverServingComPort 方法来检查给定的 COM 端口是永久的(直接 RS232)还是动态的(USB、TCP/IP 等)。例如,对于 Windows 上的 cp2102,“slabser”将作为驱动程序名称返回。这对于直接 RS232 端口会有所不同。
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2015-09-15
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多