【发布时间】:2009-09-08 00:23:55
【问题描述】:
我已经使用 RXTX 大约一年了,没有太多问题。我刚刚启动了一个新程序来与一个新硬件进行交互,所以我重用了我在其他项目中使用过的 connect() 方法,但是我遇到了一个我以前从未见过的奇怪问题。
问题
该设备工作正常,因为当我连接超级终端时,我发送并接收我期望的内容,Serial Port Monitor(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:尝试了新的东西,结果相同
我运行了找到here 的代码示例,结果相同。没有数据进来,但是当我切换到一个新程序时,它一下子就进来了。
编辑 3
硬件很好,即使是不同的计算机也有同样的问题。我没有使用任何类型的 USB 适配器。
我也开始使用PortMon,它给了我一些有趣的结果。超级终端和 RXTX 没有使用相同的设置,并且 RXTX 总是轮询端口,这与超级终端不同,但我仍然看不到哪些设置会影响这一点。一旦我可以将配置与持续轮询隔离开来,我就会发布我的 PortMon 日志。
编辑 4
是否有可能是过去 3 个月内的某种 Windows 更新导致了这种情况?它曾经把我的一个基于 MATLAB mex 的程序搞砸了。
编辑 5
我还注意到超级终端、RXTX 和我发现的与设备通信的单独程序之间的一些不同之处(但没有做我想要的,这就是我推出自己的程序的原因)
- 超级终端 - 设置为无流量控制,但串行端口监视器的 RTS 和 DTR 指示灯为绿色
- 其他程序 - 不确定它认为它正在使用什么设置,但只有 SPM 的 RTS 指示灯是绿色的
- RXTX - 无论我设置什么流控制,只有 SPM 的 CTS 和 DTR 指示灯亮。
来自 Serial Port Monitor 的帮助文件(释义):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
【问题讨论】:
标签: java serial-port rxtx