我目前正在使用RXTX来处理我的java程序中的串行通信,并且我已经成功地连接/断开连接和读/写。
然而,我无法弄清楚RXTX中是否有办法检测设备是否断开连接。如何在不轮询串口的情况下检测此事件?因为如果它在轮询之间断开连接并重新连接,它将无法被检测到,但在使用串口时仍会导致错误。
如果在RXTX中不可能,是否有任何可以检测到断开连接事件的库?
澄清:设备通过USB连接并注册为串行设备。设备重置或关闭时可能会断开连接。当它重置时,串口暂时关闭,无效连接RXTX创建。
感谢您的帮助
答案 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);
这是我看到检测断开(物理)事件的方式。