2013-07-26 79 views
6

我目前使用RXTX來處理我的Java程序中的串行通信,並且我已經成功地連接/斷開連接並讀/寫。如何檢測java中的設備何時關閉了串口?

但是我無法弄清楚RXTX是否有辦法檢測設備是否斷開連接。如何在不查詢串口的情況下檢測到此事件?因爲如果在輪詢之間斷開連接並重新連接,它將不會被檢測到,但是在使用串行端口時仍會導致錯誤。

如果在RXTX中不可能有推薦的可以檢測斷開連接事件的庫嗎?

說明:設備通過USB連接並註冊爲串行設備。設備可能會在重置或關閉時斷開連接。當它復位時,串口暫時關閉無效RXTX連接創建的連接。

感謝所有幫助

+2

取決於「斷開」的含義。你的意思是身體/電力?這可能會導致一行或多行(DCD,DTR,DSR,RTS,CTS)上的電平變化,但這取決於很多事情(即,實際上正在使用這些行中的任何一行,因爲實際上並不需要這些行)。我強烈懷疑「斷開連接」的概念是不明確的,原則上可能無法檢測到,除非您使用的物理層協議(即DCD) –

+0

,據我所知,您必須手動檢查是否設備連接到串行端口。 –

回答

1

我有同樣的問題:我是想知道,當設備從USB端口拔掉。 然後,我發現每當我從USB端口拔下設備時,它都會從serialEvent中獲得一個java.io.IOException。看看下面我的serialEvent代碼:

@Override 
public void serialEvent(SerialPortEvent evt) { 
    if(this.getConectado()){ 
     if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
     { 
      try {     
       byte singleData = (byte)input.read(); 

       if (singleData == START_DELIMITER) 
       { 
        singleData = (byte)input.read(); 
        if(singleData == (byte)0x00) 
        { 
         singleData = (byte)input.read(); //get the length 
         byte[] buffer = new byte[singleData+4]; 
         for(byte i=0x0;i<singleData;i++) 
          buffer[i+3] = (byte)input.read(); 
         buffer[buffer.length-1] = (byte)input.read(); 
         buffer[0] = START_DELIMITER; 
         buffer[1] = 0x00; 
         buffer[2] = singleData; //length 

         this.addNaLista(buffer); 

        } 
       } 
      } catch (IOException ex) { 
       Logger.getLogger(Comunicador.class.getName()).log(Level.SEVERE, null, ex); 
       /* do something here */ 
       //System.exit(1); 
      } 

     } 
    } 
} 

即使我沒有在那一刻接收數據,我仍然得到java.io.IOException的;這裏是異常跟蹤:

Jun 21, 2014 10:57:19 AM inovale.serial.Comunicador serialEvent 
SEVERE: null 
java.io.IOException: No error in readByte 
at gnu.io.RXTXPort.readByte(Native Method) 
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1250) 
at inovale.serial.Comunicador.serialEvent(Comunicador.java:336) 
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732) 
at gnu.io.RXTXPort.eventLoop(Native Method) 
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575) 

我使用的唯一的事件是:

serialPort.addEventListener(this); 
serialPort.notifyOnDataAvailable(true); 

這是我看到的檢測斷開(物理)事件的方式。