2015-08-28 74 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