我已经使用 RXTX 大约一年了,没有太多问题。我刚刚启动了一个新程序来与一个新硬件进行交互,所以我重用了我在其他项目中使用过的 connect() 方法,但是我遇到了一个我以前从未见过的奇怪问题。
问题
该设备工作正常,因为当我与超级终端连接时,我发送并接收我期望的东西,而串行端口监视器(SPM) 反映了这一点。
但是,当我运行我编写的用于诊断我的主应用程序问题的简单超级终端克隆时,根据 SPM,发送了字节,但没有收到任何内容,并且我的 SerialPortEventListener 永远不会触发。即使我在主循环中检查可用数据,也会reader.ready()
返回false
. 如果我忽略此检查,则会出现异常,详情如下。
connect() 方法的相关部分
// Configure and open port
port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
.open(owner,1000)
port.setSerialPortParams(baud, databits, stopbits, parity);
port.setFlowControlMode(fc_mode);
final BufferedReader br = new BufferedReader(
new InputStreamReader(
port.getInputStream(),
"US-ASCII"));
// Add listener to print received characters to screen
port.addEventListener(new SerialPortEventListener(){
public void serialEvent(SerialPortEvent ev) {
try {
System.out.println("Received: "+br.readLine());
} catch (IOException e) { e.printStackTrace(); }
}
});
port.notifyOnDataAvailable();
例外
java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.read(BufferedReader.java:157)
at <my code>
大问题(再次)
我想我已经消除了所有可能的硬件问题,那么我的代码或 RXTX 库可能有什么问题?
编辑:有趣的东西
当我从 java 发送了一堆本应得到响应的命令后打开超级终端时,所有响应都会立即出现,就好像它们已被放入缓冲区中的某个地方,但不可用。
编辑2:尝试了一些新的东西,同样的结果
我运行了此处找到的代码示例,结果相同。没有数据进来,但是当我切换到一个新程序时,它一下子就进来了。
编辑 3
硬件很好,即使是不同的计算机也有同样的问题。我没有使用任何类型的 USB 适配器。
我也开始使用PortMon,它给了我一些有趣的结果。超级终端和 RXTX 没有使用相同的设置,并且 RXTX 总是轮询端口,这与超级终端不同,但我仍然看不到什么设置会影响这一点。一旦我可以将配置与持续轮询隔离开来,我就会发布我的 PortMon 日志。
编辑 4
过去 3 个月内的某种 Windows 更新是否可能导致这种情况?它曾经把我的一个基于 MATLAB mex 的程序搞砸了。
编辑 5
我还注意到 HyperTerminal、RXTX 和我发现的与设备通信的单独程序之间有些不同(但没有做我想做的事,这就是我推出自己的程序的原因)
- 超级终端 - 设置为无流量控制,但串行端口监视器的 RTS 和 DTR 指示灯为绿色
- 其他程序 - 不确定它认为它正在使用什么设置,但只有 SPM 的 RTS 指示灯为绿色
- RXTX——无论我设置什么流控,只有SPM的CTS和DTR指示灯亮。
从串行端口监视器的帮助文件(释义):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready