在RXTX中收到的问题

Nat*_*ons 7 java serial-port rxtx

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

问题

该设备工作正常,因为当我连接HyperTerminal时,我发送东西并收到我期望的东西,串口监视器(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();
Run Code Online (Sandbox Code Playgroud)

例外

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>
Run Code Online (Sandbox Code Playgroud)

最重要的问题(再次)

我想我已经消除了所有可能的硬件问题,那么我的代码或RXTX库可能出现什么问题?

编辑:有趣的东西

当我从java发送一堆应该得到响应的命令后打开HyperTerminal时,所有的响应都会立即出现,好像它们已经放在某个地方的缓冲区中,但是不可用.

编辑2:尝试了一些新的,相同的结果

我运行了这里找到的代码示例,结果相同.没有数据进入,但是当我切换到一个新程序时,它立刻就出现了.

编辑3

硬件很好,甚至不同的计算机也有同样的问题.我没有使用任何类型的USB适配器.

我也开始使用PortMon,它给了我一些有趣的结果.HyperTerminal和RXTX没有使用相同的设置,并且RXTX总是轮询端口,不像HyperTerminal,但我仍然看不出会影响这个设置.只要我可以将配置与常量轮询隔离开来,我就会发布我的PortMon日志.

编辑4

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

编辑5

我还注意到HyperTerminal,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
Run Code Online (Sandbox Code Playgroud)

Nat*_*ons 7

好的,对不起,我花了很长时间才回到这个问题.这就是我让事情发挥作用的方式.

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

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
}
Run Code Online (Sandbox Code Playgroud)

所以,在我的情况下,问题是我的特定设备需要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开发人员发送电子邮件(他们非常有帮助)