我已经使用RXTX大约一年了,没有太多问题。我刚启动一个新程序来与新硬件交互,所以我重用了我在其他项目中使用过的connect()方法,但是我遇到了一个从未见过的怪异问题。
问题
该设备运行良好,因为当我与超级终端连接时,我发送东西并收到期望的东西,而串行端口监视器(SPM)反映了这一点。
但是,当我运行简单的HyperTerminal-
clone来诊断主应用程序遇到的问题时,根据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
我还注意到超级终端,RXTX和我发现的与设备进行通信的单独程序之间的某些区别(但不执行我想要的操作,这就是为什么我要滚动自己的程序的原因)
从串行端口监视器的帮助文件中(措辞如下):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
好的,很抱歉花了我这么长时间才回到这个问题。这就是我让事情正常进行的方式。
注意:此方法 不适 用于所有人,请在复制/粘贴到自己的代码之前阅读以下内容
public void connect(CommPortIdentifier portId) throws Failure {
if (portId == null)
throw new Failure("No port set");
try { port = (SerialPort) portId.open(getClass().getName(), 10000); }
catch (PortInUseException e) {
throw new Failure("Port in use by " + e.currentOwner,e); }
try {
port.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN
| SerialPort.FLOWCONTROL_RTSCTS_OUT);
} catch (UnsupportedCommOperationException e) { throw new Failure(e); }
port.setRTS(true);
// More setup
}
因此,就我而言,问题是我的特定设备需要RTS流控制。其他设备可能需要其他内容(CTS,XON /
XOFF),因此请查看该设备的手册。默认情况下,RXTX禁用所有流控制机制(与Hypertrm或其他程序不同)。启用每个过程需要两个步骤。
setFlowControlMode()
方法,然后|
对所需的SerialPort.FLOWCONTROL_
常量进行按位或(’ ‘)port.setRTS(true)
)对于其他有类似问题的人,如果这不起作用,我建议
问题内容: 我正在尝试使用RXTX库来阻止Windows(XP和7)上的串行通信。我已经在两端测试了与Hyperterminal的连接,并且可以正常工作。 我使用以下代码设置了连接:(为清楚起见,省略了异常处理和防御检查) 当我使用 该消息在另一端收到很好,但是打电话 直接返回“ java.io.IOException:基础输入流返回零字节”。 然后,我决定尝试实现自己的阻塞读取逻辑,并写成这样:
RXTX 是一个跨平台的 Java 串口通信程序开发包。 MINA 就是使用 RXTX 来实现与串口的通讯。
我开始使用最新的androidx。支持io的文件室版本。reactivex返回类型。 简单dao类 生成用户dao\u Impl。java出现错误 错误:从内部类访问局部变量用户;需要宣布为最终 突出显示的字段在此方法中 的确,在java中应该将声明为final,但它是由类生成的。有人遇到过这个吗?
我想在我的Raspberry Pi上安装一个rxtx捆绑包,该捆绑包将在KURA平台上运行(Equinox是Kura的OSGi容器) 我使用:sudo apt get install librxtx java安装了rxtx本机库 这个所以安装在目录:/usr/lib/jni上/ 然后我按照这个链接将rxtx库包装成一个捆绑包http://rxtx.qbang.org/wiki/index.php/
我是新来的Java,并试图编写一个串行通信应用程序。 我用的是Windows 7(32 bit) 我下载了RxTx http://henrypoon.wordpress.com/2010/12/25/installing-rxtx-for-serial-communication-with-java/ http://rxtx.qbang.org/wiki/index.php/Using_RXTX