在RXTX中接收问题

我已经使用RXTX大约一年了,没有太多问题。我刚启动一个新程序来与新硬件交互,所以我重用了我在其他项目中使用过的connect()方法,但是我遇到了一个从未见过的怪异问题。

该设备运行良好,因为当我与超级终端连接时,我发送东西并收到期望的东西,而串行端口监视器(SPM)反映了这一点。

但是,当我运行简单的HyperTerminal-

clone来诊断主应用程序遇到的问题时,根据SPM,字节发送了,但是什么也没收到,我的SerialPortEventListener从未触发。即使在主循环中检查可用数据时,也会reader.ready()返回false。如果我忽略此检查,则会出现异常,详细信息如下。

// 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发送了一堆本应该得到响应的命令后打开超级终端时,所有响应都会立即显示,就好像它们已经放在缓冲区的某个地方,但是不可用。

我运行了在这里找到的代码示例,结果相同。没有数据输入,但是当我切换到一个新程序时,它一次全部出现。

硬件很好,甚至其他计算机也有同样的问题。我没有使用任何USB适配器。

我也开始使用PortMon,它给了我一些有趣的结果。超级终端和RXTX使用的设置不同,与超级终端不同,RXTX总是轮询端口,但是我仍然看不到什么设置会影响此设置。一旦可以从持续轮询中隔离出配置,就将发布PortMon日志。

在过去的3个月中某种Windows更新是否可能导致了这种情况?它曾经搞砸了我的一个基于MATLAB mex的程序。

我还注意到超级终端,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

回答:

好的,很抱歉花了我这么长时间才回到这个问题。这就是我让事情正常进行的方式。

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或其他程序不同)。启用每个过程需要两个步骤。

  1. 一旦有了SerialPort对象,就调用该setFlowControlMode()方法,然后|对所需的SerialPort.FLOWCONTROL_常量进行按位或(’ ‘)
  2. 将适当的流控制设置为true或false(就像我对进行的操作一样port.setRTS(true)

对于其他有类似问题的人,如果这不起作用,我建议

  1. 使用串行端口监视程序(如“ 串行端口监视器”和/或PortMon(两个Windows))来查看实际发生的情况。
  2. 通过rxtx@qbang.org向RXTX开发人员发送电子邮件(他们非常有帮助)

以上是 在RXTX中接收问题 的全部内容, 来源链接: utcz.com/qa/426346.html

回到顶部