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が発生するはずですが、同じ結果が得られます。
私が欠けているものについての助けをいただければ幸いです。