代码之家  ›  专栏  ›  技术社区  ›  fred basset

如何使用Java comm API处理读取超时

  •  1
  • fred basset  · 技术社区  · 15 年前

    我的应用程序使用Java串行通信api。从读取文档到输入流。如果没有可用数据,read()方法将被阻止。

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

    那么,在上述情况下,实现读取超时的最佳方法是什么?

    谢谢 弗莱德

    4 回复  |  直到 15 年前
        1
  •  1
  •   Pyrolistical    15 年前

    如果它不适合您,只需将inputstream放入一个线程,并实现自己的超时。如果超时,则调用流上的close()来解除阻塞并关闭该线程

        2
  •  1
  •   Ben S    15 年前

    你需要两条线。

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

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

    让看门狗线程在读取开始时启动计时器,并在读取线程超时时中断读取线程,或在读取完成时停止侦听一段时间。

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

        3
  •  1
  •   Progman    15 年前

    你可以向 InputStream.available() 如果下一个 read() 会不会被阻挡。

        4
  •  0
  •   Jörn Horstmann    15 年前

    您还可以使用SerialPorteEventListener作为回调,以获得新可用数据的通知,并且仅在有事情要做时调用read。

    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
            }
        }
    });