在RXTX中不断的轮询是必要的吗?

在试图找出这个问题的时候 ,我运行RXTX,同时使用PortMon监视它的活动,注意到RXTX不断检查数据是否可用,即使Java客户端只从gnu.io.SerialPort对象读取通过一个SerialPortEventListener。

为什么是这样? RXTX是一个糟糕的实现select,Sun公司的糟糕的APIselect(因为RXTX遵循javax.comm API),还是运行本机代码所支持的Java的限制?

超级terminal,另一方面,没有投票(工作没有问题)。 它有访问一些隐藏的Windows系统调用,让它这样做吗?

Solutions Collecting From Web of "在RXTX中不断的轮询是必要的吗?"

不,这不是由于javax.xomm API造成的。 Rxtx可以通过该API使用或不按顺序使用。

Rxtx的内部结构有些不同/奇怪,但有一些错误。 短版本,这是应该如何工作:你有两个参数来玩:超时和阈值。 根据源代码将超时设置为0(无)和阈值设置为1(在返回之前至少需要1个字节)应该使我们正常,通过定义的InputStream阻塞读取。

问题是即使像这样设置,当前的稳定版本(2.1.7r2)也存在一个错误。 阈值参数始终设置为0! 从源代码:

/ *测试ttyset.c_cc [VMIN] =阈值; * / ttyset.c_cc [VMIN] = 0;

令人困惑的是,2004年也是如此,并在邮件列表中报告,并且是固定的,但是要么不是真正的固定,要么是再次回归(回归)。 实际上有一个新的错误报告,由于某种原因我起初找不到。 我最终发现它会抛出预发行包的源代码,并发现一个否则未发布的更改日志(该网页在最后一个稳定版本之后没有显示更改日志,尽管它在CVS中可用)。

  1. 它固定在HEAD上,所以你可以使用最新的预发布版本(2.2系列)或从CVS编译。
  2. 沿着以下几点建立一个丑陋的解决方法:

    int read(InputStream in) throws IOException { int b; while ((b=in.read()) == -1) { try { Thread.sleep(10); } catch (InterruptedException e) { } } return b; } 

然后你做: read(in)而不是in.read()

我其实写了一个关于这个 2年前的博客条目,所以我不会忘记。