2010-04-12 38 views
1

我的应用程序使用Java串行通信API。从阅读文档中,如果没有可用的数据,inputstream.read()方法会被阻塞。如何处理使用Java通信API读取超时

我试着在serialport对象上设置超时,但isReceiveTimeoutEnabled()方法返回false,表明我的驱动程序本身不支持超时。

那么实现上述读取超时的最佳方式是什么?

感谢, 弗雷德

回答

1

如果它不工作对你只是折腾那的InputStream成线,并实现自己的时间了。如果超时,请在流上调用close()以取消阻止并关闭该线程

1

您将需要两个线程。

看门狗线程将监视读取线程并在检测到超时时将其中断。

阅读线程告诉看门狗线程它即将开始阅读,以及何时完成阅读。

看门狗线程在读操作开始时启动一个定时器,并在读操作超时时中断读线程,或在读操作完成时停止监听超时。

如果您不熟悉Java线程,请阅读它。多线程错误很容易。

0

您还可以使用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 
     } 
    } 
});