我的应用程序使用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
}
}
});