我正在使用RXTX从串口读取数据。读取是在以下方式生成的线程中完成的:
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port);
CommPort comm = portIdentifier.open("Whatever", 2000);
SerialPort serial = (SerialPort)comm;
...settings
Thread t = new Thread(new SerialReader(serial.getInputStream()));
t.start();
SerialReader类实现了Runnable接口,它只是无限循环地从端口读取数据,并将数据组装成有用的包,然后将其发送给其他应用程序。但是,我已将其简化为以下简单形式:
public void run() {
ReadableByteChannel byteChan = Channels.newChannel(in); //in = InputStream passed to SerialReader
ByteBuffer buffer = ByteBuffer.allocate(100);
while (true) {
try {
byteChan.read(buffer);
} catch (Exception e) {
System.out.println(e);
}
}
}
当用户点击停止按钮时,以下功能应该理论上触发,以关闭输入流并跳出阻塞的byteChan.read(buffer)调用。 代码如下:
public void stop() {
t.interrupt();
serial.close();
}
然而,当我运行这段代码时,即使输入流关闭,我从未遇到过ClosedByInterruptException异常。此外,调用serial.close()会阻塞执行,因为底层输入流仍在读取调用中阻塞。我尝试使用byteChan.close()替换中断调用,这应该会导致AsynchronousCloseException异常,但我得到了相同的结果。如果您能提供任何帮助并告诉我哪里有问题,我将不胜感激。