Java serialport关闭块

Jur*_*ert 22 java serial-port

我与一个单元通信,通过串行连接控制卫星天线.

打开与串行设备的连接:

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

如果设备不可用,我必须在设备再次启动之前清除流,然后才能发送新命令.但是,如果设备关闭,输入/输出流上的这种清晰方法会阻塞.还关闭流,或关闭SerialDevice块.

有没有办法关闭/清除这些流或SerialDevice而不阻塞?

bufferedRead.close(); // blocks until device is up again
outputStream.close(); // blocks until device is up again
serialPort.close(); // blocks until device is up again
Run Code Online (Sandbox Code Playgroud)

may*_*ʎɐɯ 3

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

这不是最终答案,而是对我找到的替代解决方案的建议。

我认为 RXTX 有两个问题:

  1. 根据您的 IDE,您需要将 Mac:RXTXcomm.jarlibrxtxSerial.jnilibPC:RXTXcomm.jar放置rxtxSerial.dll在 IDE 或 Java 代码中项目的根目录中,每个 IDE 的位置都不同。这里的文档没有介绍如何做到这一点,并且在 NetBeans、IntelliJ 等不同的 IDE 中,即使我让它可以在 Eclipse 和 IntelliJ 上工作,但还不能在 NetBeans 上工作。它还存在其他令人痛苦的问题。
  2. 根据您的操作系统,即使您启动并运行此软件包(以 Windows 8.1 为例),关闭端口时也会出现问题。唯一的解决方案是重新启动 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,它关闭端口没有问题。

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

我已经在 Stackoverflow 上回答了另一个人之前提出的类似问题

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