我一直在使用RXTX大约一年,没有太多问题。我刚开始一个新程序来与新硬件进行交互,所以我重用了我在其他项目中使用的connect()方法,但是我有一个我从未见过的奇怪问题。接收RXTX的问题
的问题
该设备工作正常,因为当我使用超级终端连接,我送的东西,并接受我的期望,并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指示灯亮起。
从串行端口监视器的帮助文件(转述):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
请问您使用流量控制吗? 在此先感谢... – Oso
希望这个编辑帮助 –
@drhorrible我看你是如何设置你的串口对象的流量控制。这很清楚。但是我想弄清楚你是如何检测流量控制字符已经发送的?我像你一样使用XON XOFF和RTS。不过,我认为它应该是相似的。 0x13,0x11是我期望在serialEvent中看到的字符吗?你怎么能够在代码中检测到这一点? – ril3y