我的應用程序使用Java串行通信API。從閱讀文檔中,如果沒有可用的數據,inputstream.read()方法會被阻塞。如何處理使用Java通信API讀取超時
我試着在serialport對象上設置超時,但isReceiveTimeoutEnabled()方法返回false,表明我的驅動程序本身不支持超時。
那麼實現上述讀取超時的最佳方式是什麼?
感謝, 弗雷德
我的應用程序使用Java串行通信API。從閱讀文檔中,如果沒有可用的數據,inputstream.read()方法會被阻塞。如何處理使用Java通信API讀取超時
我試着在serialport對象上設置超時,但isReceiveTimeoutEnabled()方法返回false,表明我的驅動程序本身不支持超時。
那麼實現上述讀取超時的最佳方式是什麼?
感謝, 弗雷德
如果它不工作對你只是折騰那的InputStream成線,並實現自己的時間了。如果超時,請在流上調用close()以取消阻止並關閉該線程
您將需要兩個線程。
看門狗線程將監視讀取線程並在檢測到超時時將其中斷。
閱讀線程告訴看門狗線程它即將開始閱讀,以及何時完成閱讀。
看門狗線程在讀操作開始時啓動一個定時器,並在讀操作超時時中斷讀線程,或在讀操作完成時停止監聽超時。
如果您不熟悉Java線程,請閱讀它。多線程錯誤很容易。
如果下一個read()
將會阻塞,您可以使用InputStream.available()方法進行檢查。
您還可以使用SerialPortEventListener作爲回調來獲取新的可用數據的通知,並且只有在需要執行操作時才調用讀取。
final SerialPort serialPort = ...;
final InputStream in = serialPort.getInputStream();
serialPortal.notifyOnDataAvailable(true);
serialPort.addEventListener(new SerialPortEventListener() {
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
// read from InputSteam
}
}
});