2013-07-26 7 views
6

私は現在、私のJavaプログラムでシリアル通信を処理するためにRXTXを使用していますが、接続/切断と読み書きができました。シリアルポートがjavaでデバイスによって閉じられたときを検出するにはどうすればよいですか?

しかし、私はRXTXがデバイスの終端で切断するかどうかを検出する方法があるかどうかはわかりません。シリアルポートをポーリングせずにこのイベントをどのように検出しますか?ポーリングを切断して再接続すると、検出されず、シリアルポートが使用されてもエラーが発生するためです。

RXTXでは切断イベントを検出できるライブラリはありませんか?

明確化:デバイスはUSBで接続され、シリアルデバイスとして登録されます。デバイスがリセットまたはオフになると、デバイスが切断されることがあります。シリアルポートをリセットすると、RXTXが作成した接続が無効になります。任意のヘルプ

+2

「切断」という言い方によって異なります。物理的/電気的な意味ですか?これは、1つ以上の回線(DCD、DTR、DSR、RTS、CTS)のレベル変更を引き起こす可能性がありますが、それは多くのことに依存します(実際には使用されていないため、私は強く疑わしい "断絶"の概念が不確定で、物理層プロトコル(すなわちDCD) –

+0

を提供していない限り、原理的には検出できないかもしれません。デバイスがシリアルポートに接続されている。 –

答えて

1

ため

おかげで、私は同じ問題を抱えている:私は、デバイスがUSBポートから抜かれたときを知るしようとしていました。 次に、USBポートからデバイスを取り外すたびに、serialEventからjava.io.IOExceptionが取得されることがわかりました。以下の私のserialEventコードを見てみましょう:私はその瞬間にデータを受信して​​いない場合でも、私はまだにjava.io.IOExceptionを得る

@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); 
      } 

     } 
    } 
} 

を。ここで例外トレースは次のとおりです。私は使用しています

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); 

これは私が切断(物理的に)イベントを検出するのに見る方法です。

関連する問題