proyectos - ¿Cómo puedo detectar cuándo el dispositivo ha cerrado un puerto serie en Java?
java y arduino proyectos (1)
Tengo el mismo problema: estaba tratando de saber cuándo se desenchufó el dispositivo del puerto USB. Luego, descubrí que cada vez que desconectaba el dispositivo del puerto USB, obtenía una java.io.IOException de serialEvent. Echa un vistazo a mi código serialEvent a continuación:
@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);
}
}
}
}
Incluso si no estoy recibiendo datos en ese momento, aún recibo la excepción java.io.IOException; aquí está el rastro de excepción:
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)
Los únicos eventos que uso son:
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
Esta es la forma en que veo para detectar un evento de desconexión (físicamente).
Actualmente estoy usando RXTX para manejar comunicación serial en mi programa java y he podido conectar / desconectar y leer / escribir exitosamente.
Sin embargo, no he podido averiguar si hay una forma en RXTX de detectar si un dispositivo se desconecta por su extremo. ¿Cómo detectaría este evento sin sondear los puertos serie? Dado que si se desconecta y vuelve a conectar entre sondeos, no se detectaría, pero seguiría causando errores cuando se utilizara el puerto serie.
Si no es posible en RXTX, ¿hay alguna biblioteca que se recomiende que pueda detectar un evento de desconexión?
Aclaración: el dispositivo se conecta a través de USB y se registra como un dispositivo en serie. El dispositivo puede desconectarse cuando se restablece o se apaga. Cuando se restablece el puerto en serie se cierra momentáneamente la invalidación de la conexión creada por RXTX.
Gracias por cualquier ayuda