我已经使用RXTX大约一年了,没有太多问题。我刚开始一个新的程序来与新的硬件交互,所以我重用了我在其他项目中使用过的connect()方法,但是我遇到了一个我从未见过的奇怪问题。
问题
设备运行正常,因为当我使用HyperTerminal连接时,我发送和接收到我期望的东西,并且Serial Port Monitor(SPM)反映了这一点。
然而,当我运行我编写的简单HyperTerminal克隆程序来诊断我主应用程序中遇到的问题时,根据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发送应该获得响应的一堆命令之后打开HyperTerminal时,所有响应都会立即显示出来,就好像它们被放在某个缓冲区中,但无法使用。
编辑2:尝试了一些新的东西,结果相同
我运行了在这里找到的代码示例,结果相同。没有数据进入,但当我切换到一个新程序时,所有数据都一起出现了。
编辑3
硬件是好的,甚至另一台计算机也有同样的问题。我没有使用任何USB适配器。
我开始使用PortMon,它给我提供了一些有趣的结果。HyperTerminal和RXTX没有使用相同的设置,而且RXTX总是轮询端口,不像HyperTerminal,但我仍然看不到哪些设置会影响这个问题。一旦我能够从不断轮询中隔离出配置,我将发布我的PortMon日志。
编辑4
有可能是在过去的三个月中的某次Windows更新导致了这个问题吗?它曾经搞砸过我的一个基于MATLAB的mex程序。
编辑5
我还注意到HyperTerminal、RXTX和我找到的一个与设备通信的单独程序之间存在一些不同之处(但它不能做我想要的事情,这就是为什么我正在编写自己的程序)
- HyperTerminal - 设置为无流控制,但串口监视器的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