Я использую 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, однако я получаю те же результаты.
Любая помощь в том, что мне не хватает, будет очень признательна.