Ich benutze RXTX, um Daten von einer seriellen Schnittstelle zu lesen. Der Messwert wird in einem in der folgenden Weise erzeugte Thread durchgeführt:Thread-Interrupt nicht endend blockierend Call on Input-Stream lesen
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();
Die SerialReader Klasse implementiert Runnable und nur Schlaufen auf unbestimmte Zeit, von dem Port zu lesen und die Daten in nützliche Pakete konstruieren, bevor es aus anderen Anwendungen gesendet werden. Allerdings habe ich es reduziert auf die folgende Einfachheit unten:
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);
}
}
}
Wenn ein Benutzer eine Stopptaste klickt, werden die folgenden Funktionen ausgelöst, die den Eingangsstrom in der Theorie schließen und brechen aus dem Sperr byteChan.read (Puffer) Anruf. Der Code lautet wie folgt:
public void stop() {
t.interrupt();
serial.close();
}
Allerdings, wenn ich diesen Code ausführen, bekomme ich nie eine ClosedByInterruptException, die einst der Eingangsstrom schließt ausgelöst werden soll. Außerdem blockiert die Ausführung beim Aufruf von serial.close() - weil der zugrundeliegende Eingabestream beim Lesen weiterhin blockiert. Ich habe versucht, den Unterbrechungsaufruf mit byteChan.close() zu ersetzen, der dann eine AsynchronousCloseException verursachen sollte, jedoch erhalte ich die gleichen Resultate.
Jede Hilfe auf, was ich vermisse, würde sehr geschätzt werden.
Das funktioniert definitiv. Vielen Dank. –