2013-07-26 65 views
6

Tôi hiện đang sử dụng RXTX để xử lý giao tiếp nối tiếp trong chương trình java của mình và tôi đã có thể kết nối/ngắt kết nối và đọc/ghi thành công.Làm thế nào để phát hiện khi một cổng nối tiếp đã được thiết bị đóng trong java?

Tuy nhiên tôi chưa thể tìm ra liệu có cách nào trong RXTX phát hiện xem thiết bị có ngắt kết nối khi kết thúc hay không. Làm thế nào bạn sẽ phát hiện sự kiện này mà không cần bỏ phiếu các cổng nối tiếp? Kể từ khi nó ngắt kết nối và kết nối lại giữa các cuộc thăm dò nó sẽ không được phát hiện nhưng vẫn gây ra lỗi khi cổng nối tiếp được sử dụng.

Nếu không thể có trong RXTX, có bất kỳ thư viện nào khuyên bạn có thể phát hiện sự kiện ngắt kết nối không?

Làm rõ: Thiết bị được kết nối qua USB và đăng ký làm thiết bị nối tiếp. Thiết bị có thể ngắt kết nối khi thiết bị được đặt lại hoặc tắt. Khi thiết lập lại cổng nối tiếp bị vô hiệu hóa trong giây lát, kết nối mà RXTX đã tạo.

Cảm ơn bạn đã giúp đỡ

+2

Phụ thuộc vào ý bạn bằng cách "ngắt kết nối". Bạn có nghĩa là vật lý/điện? Điều này có thể gây ra thay đổi cấp trên một hoặc nhiều dòng (DCD, DTR, DSR, RTS, CTS) nhưng điều đó phụ thuộc vào rất nhiều thứ (tức là bất kỳ dòng nào trong số này thực sự được sử dụng, vì không có dòng nào trong số đó thực sự được yêu cầu). Tôi mạnh mẽ nghi ngờ khái niệm "ngắt kết nối" không được xác định, và có thể không được phát hiện về nguyên tắc trừ khi bạn đang sử dụng giao thức tầng vật lý cung cấp cho nó (tức là DCD) –

+0

theo như tôi biết bạn phải tự kiểm tra xem thiết bị được kết nối với cổng nối tiếp. –

Trả lời

1

Tôi gặp vấn đề tương tự: Tôi đang cố gắng biết khi nào thiết bị đã được rút phích cắm khỏi cổng USB. Sau đó, tôi phát hiện ra rằng mỗi khi tôi rút phích cắm thiết bị khỏi cổng USB, nó nhận được một java.io.IOException từ serialEvent. Hãy xem mã serialEvent của tôi bên dưới:

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

     } 
    } 
} 

Ngay cả khi tôi không nhận dữ liệu tại thời điểm đó, tôi vẫn nhận được java.io.IOException; đây là dấu vết ngoại lệ:

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) 

Các sự kiện duy nhất mà tôi đang sử dụng là:

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

Đây là cách tôi nhìn thấy để phát hiện một (vật lý) sự kiện ngắt kết nối.

Các vấn đề liên quan