2015-08-28 75 views
0

我正在开发一个应用程序,需要能够通过Windows OS上的串行通信与设备进行通信。该应用程序是用Java编写的。我正在使用jSSC库。 (Javax.comm有问题,RxTx除了非正式更新外没有Java 8支持)设备可以使用串行端口直接连接到PC,或使用USB到串行转换器。Windows上的Java通信端口 - 自动端口检测

我的问题: 窗口上的COM端口是动态的。这提出了一个问题来定义连接到哪个通信端口。有没有办法自动找出连接哪个COM端口?

到目前为止,我已经能够提出的唯一解决方案涉及扫描所有通信端口的活动端口,保存该列表,然后要求用户插入设备并执行另一次扫描 - 额外的COM端口将会成为连接的人。

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

+0

我还没有看到一个很好的自动检测方案。你永远不知道其他设备如何反应,因为你已经提到。如果你只在Windows上运行,我会建议一个.net中的帮助程序库,它可以捕获USB插入的事件。如果这是一个经典的DB9,那么我对你没有任何帮助。查看我的名为Porty的应用程序,它执行端口名称检测。你可能可以适应你的需求。 https://github.com/corytodd/porty –

+0

谢谢!我看了一下你的应用程序,看起来可能会有所帮助。 –

回答

0

用于检测端口的动态操作系统特定的功能需要被调用。 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(); 
} 
+0

这只适用于我假设的USB设备?我已经设法说服参与这个项目的大多数参与者转向USB或TCP/IP,但仍然有一些(并且可能持续相当一段时间)坚持使用串行(直接RS232) –

+0

您可以使用findDriverServingComPort方法检查给定的COM端口是永久的(直接RS232)还是动态的(USB,TCP/IP等)。例如,对于Windows上的cp2102,“slabser”将作为驱动程序名称返回。对于直接的RS232端口,这将是不同的。 – samuel05051980