Java serialport close blocks

2022-09-02 02:03:17

我与通过串行连接控制卫星天线的单元进行通信。

打开与串行设备的连接:

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

portIdentifier = CommPortIdentifier.getPortIdentifier(device);
serialPort = (SerialPort) portIdentifier.open(name, 
serialPort.setSerialPortParams(baudrate, databits, stopbits, parity);
serialPort.setFlowControlMode(flowMode);

bufferedReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
outputStream = serialPort.getOutputStream();

如果设备不可用,我必须清除流,然后才能发送新命令,一旦设备再次启动。但是,如果设备出现故障,输入/输出流上的这种清晰方法会阻止。同时关闭流,或关闭串行设备块。

有没有办法关闭/清除这些流或串行设备而不阻塞?

bufferedRead.close(); // blocks until device is up again
outputStream.close(); // blocks until device is up again
serialPort.close(); // blocks until device is up again

答案 1

我已经看过这篇文章一段时间了,在使用 gnu.io 软件包(也称为RXTX)时,我在关闭串行端口时遇到了同样的问题。

这不是最终答案,而是我发现的替代解决方案的建议。

在我看来,RXTX有两个问题,如果不是更多的话:

  1. 根据您的 IDE,您需要将 Mac: 和 PC: 放在 IDE 或 Java 代码中项目的根目录上,它因 IDE 而异。这里的文档没有介绍如何执行此操作,在不同的IDE中,例如NetBeans,IntelliJ,即使我让它同时在Eclipse和IntelliJ上工作,但还没有NetBeans。它还有其他痛苦的问题。RXTXcomm.jarlibrxtxSerial.jnilibRXTXcomm.jarrxtxSerial.dll
  2. 根据您的操作系统,即使您启动并运行此程序包,例如在Windows 8.1中,它也会在关闭端口时遇到问题。唯一的解决方案是重新启动IDE/控制台并重新连接。在开发项目时,每次重新启动IDE时,您都会疯狂地重新启动IDE。

我花了很多时间寻找解决方案,并且没有解决方案可以正确关闭端口,也许对于Windows 8.1及更高版本(不知道其他环境关闭端口问题),因为软件包很旧,支持有限。

因此,我建议使用一个更省头的软件包,称为JSSC。

以下是使用JSSC从串行端口读取数据的简单方法:

public class Main {

    public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM1");
        try {
            serialPort.openPort();//Open serial port
            serialPort.setParams(9600, 8, 1, 0);//Set params.
            byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port
            serialPort.closePort();//Close serial port
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}

而且,它关闭了端口而没有问题。

注意:这是一个开放的答案,如果任何人对此有相关经验,请通过编辑答案来贡献。我见过人们在互联网上问这个问题,并且对RXTX有几乎相同的问题,并且没有找到RXTX的可行解决方案。

我已经在Stackoverflow中回答了另一个以前类似的问题的人。

我想分享我所拥有的知识,这对那些面临相同问题的人来说可能是有用的。它可以让你的一天不那么痛苦。


答案 2

推荐