Tôi đang sử dụng RXTX để đọc dữ liệu từ cổng nối tiếp. Phép đo được thực hiện trong vòng một sợi sinh ra theo cách sau đây: lớpNgắt chuỗi không kết thúc cuộc gọi chặn trên luồng đầu vào đọc
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();
các SerialReader thực hiện Runnable và chỉ lặp vô hạn định, đọc từ cảng và xây dựng dữ liệu thành các gói hữu ích trước khi gửi nó đi vào các ứng dụng khác. Tuy nhiên, tôi đã giảm nó xuống để tính đơn giản sau:
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);
}
}
}
Khi người dùng nhấp vào một nút dừng, đám cháy chức năng sau đó nên về mặt lý thuyết đóng dòng đầu vào và thoát ra khỏi byteChan.read chặn (bộ đệm). Mã này như sau:
public void stop() {
t.interrupt();
serial.close();
}
Tuy nhiên, khi tôi chạy mã này, tôi không bao giờ nhận được một ClosedByInterruptException, NÊN sẽ kích hoạt khi luồng đầu vào đóng. Hơn nữa, các khối thực hiện trên cuộc gọi đến serial.close() - bởi vì luồng đầu vào cơ bản vẫn đang chặn trên cuộc gọi đọc. Tôi đã thử thay thế các cuộc gọi ngắt với byteChan.close(), mà sau đó sẽ gây ra một AsynchronousCloseException, tuy nhiên, tôi nhận được kết quả tương tự.
Bất kỳ trợ giúp nào về những gì tôi thiếu sẽ được đánh giá cao.
Điều này chắc chắn hoạt động. Cảm ơn. –