2013-07-26 14 views
6

Attualmente sto usando RXTX per gestire la comunicazione seriale nel mio programma java e sono riuscito a connettermi/disconnettermi e leggere/scrivere.Come posso rilevare quando una porta seriale è stata chiusa dal dispositivo in java?

Tuttavia, non sono in grado di capire se c'è un modo in RXTX per rilevare se un dispositivo si disconnette al suo fine. Come si rileva questo evento senza il polling delle porte seriali? Dal momento che se disconnette e riconnette tra i sondaggi, non verrebbe rilevato ma causerebbe comunque errori quando si utilizza la porta seriale.

Se non è possibile in RXTX ci sono librerie che potrebbero essere consigliate per rilevare un evento di disconnessione?

Chiarimento: il dispositivo è collegato tramite USB e registra come dispositivo seriale. Il dispositivo potrebbe disconnettersi quando si reimposta o si spegne. Quando si reimposta la porta seriale viene momentaneamente chiusa l'invalidazione della connessione RXTX creata.

Grazie per qualsiasi aiuto

+2

Dipende cosa si intende per "disconnessione". Intendi fisicamente/elettricamente? Ciò potrebbe causare cambiamenti di livello su una o più linee (DCD, DTR, DSR, RTS, CTS) ma ciò dipenderebbe da un sacco di cose (cioè una di queste linee è effettivamente utilizzata, poiché nessuno di questi è effettivamente richiesto). Sospetto fortemente che il concetto di "disconnessione" sia mal definito e potrebbe non essere rilevabile in linea di principio a meno che non si stia utilizzando un protocollo di livello fisico che lo fornisce (es. DCD) –

+0

per quanto ne so è necessario verificare manualmente se il dispositivo è collegato alla porta seriale. –

risposta

1

Ho lo stesso problema: stavo cercando di capire quando il dispositivo è stato scollegato dalla porta USB. Poi, ho scoperto che ogni volta che ho scollegato il dispositivo dalla porta USB, si ottiene un java.io.IOException da serialEvent. Date un'occhiata al mio codice serialEvent di seguito:

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

     } 
    } 
} 

Anche se Non si ricevono i dati in quel momento, ho ancora ottenere il java.io.IOException; qui è la traccia di eccezione:

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) 

Gli unici eventi che sto usando è:

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

Questo è il mio modo di vedere di individuare una (fisicamente) evento di disconnessione.