我与一个单位通信,通过串行连接控制卫星天线。
打开与串行设备的连接:
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();
如果设备不可用,我必须在设备再次启动之前清除流,然后才能发送新命令。但是,如果设备关闭,输入/输出流上的这种清晰方法会阻塞。同时关闭流,或关闭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
答案 0 :(得分:3)
我已经看过这篇文章了,我在使用gnu.io包时也遇到了同样的问题,也就是所谓的RXTX。
这不是最终答案,而是对我找到的替代解决方案的建议。
RXTX在我看来有两个问题,如果不是更多:
RXTXcomm.jar
和librxtxSerial.jnilib
以及PC:项目根目录中的PC:RXTXcomm.jar
,rxtxSerial.dll
或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);
}
}
}
而且,它关闭了没有问题的端口。
注意:这是一个公开的答案,如果任何人有相关经验,请通过编辑答案做出贡献。 我见过人们在互联网上提出这个问题并且一般都遇到了与RXTX几乎相同的问题,并且没有为RXTX找到可行的解决方案。
我已经回答了另一个在Stackoverflow中具有类似先前question的人。
我想分享我所拥有的知识,对于那些面临同样问题的人来说,这可能是有用的。它可以让你的一天减少痛苦。