gpt4 book ai didi

java - RXTX 接收问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:57 25 4
gpt4 key购买 nike

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

问题

设备工作正常,因为当我连接 super 终端时,我发送和接收我期望的东西,并且Serial Port Monitor (SPM) 反射(reflect)了这一点。

但是,当我运行我编写的简单 super 终端克隆来诊断我的主应用程序遇到的问题时,根据 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:尝试新的东西,结果相同

我运行了找到的代码示例 here , 结果相同。没有数据进来,但是当我切换到一个新程序时,它一下子就进来了。

编辑3

硬件没问题,换台电脑也是一样的问题。我没有使用任何类型的 USB 适配器。

我已经开始使用 PortMon ,它也给了我一些有趣的结果。 HyperTerminal 和 RXTX 没有使用相同的设置,RXTX 总是轮询端口,与 HyperTerminal 不同,但我仍然看不出什么设置会影响这一点。一旦我可以将配置与持续轮询隔离开来,我就会发布我的 PortMon 日志。

编辑4

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

编辑5

我还注意到 HyperTerminal、RXTX 和我发现的与设备通信的单独程序之间的一些不同之处(但不做我想做的事,这就是我推出自己的程序的原因)

  • super 终端 - 设置为无流量控制,但 Serial Port Monitor 的 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

最佳答案

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

注意:此方法对所有人都有效,请在复制/粘贴到您自己的代码之前阅读以下内容

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. 使用串行端口监控程序,如 Serial Port Monitor和/或 PortMon (两个 Windows)以查看实际情况。
  2. 通过 rxtx@qbang.org 向 RXTX 开发人员发送电子邮件(他们非常乐于助人)

关于java - RXTX 接收问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com