我与一个单元通信,通过串行连接控制卫星天线.
打开与串行设备的连接:
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)
我已经看到这篇文章有一段时间了,在使用 gnu.io 包(也称为 RXTX)时,我也遇到了关闭串行端口的相同问题。
这不是最终答案,而是对我找到的替代解决方案的建议。
我认为 RXTX 有两个问题:
RXTXcomm.jar和librxtxSerial.jnilibPC:RXTXcomm.jar放置rxtxSerial.dll在 IDE 或 Java 代码中项目的根目录中,每个 IDE 的位置都不同。这里的文档没有介绍如何做到这一点,并且在 NetBeans、IntelliJ 等不同的 IDE 中,即使我让它可以在 Eclipse 和 IntelliJ 上工作,但还不能在 NetBeans 上工作。它还存在其他令人痛苦的问题。我花了很多时间寻找解决方案,但对于 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 上回答了另一个人之前提出的类似问题。
我想分享我所拥有的知识,这对于面临同样问题的人来说可能很有用。它可以让你的一天不那么痛苦。