Java serialport关闭块

时间:2011-05-12 14:11:25

标签: 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();

如果设备不可用,我必须在设备再次启动之前清除流,然后才能发送新命令。但是,如果设备关闭,输入/输出流上的这种清晰方法会阻塞。同时关闭流,或关闭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

1 个答案:

答案 0 :(得分:3)

我已经看过这篇文章了,我在使用gnu.io包时也遇到了同样的问题,也就是所谓的RXTX。

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

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

  1. 根据您的IDE,您需要为Mac放置:RXTXcomm.jarlibrxtxSerial.jnilib以及PC:项目根目录中的PC:RXTXcomm.jarrxtxSerial.dll或Java代码,它因IDE而异。这里的文档没有介绍如何做到这一点,并且在NetBeans,IntelliJ等不同的IDE中,即使我已经在Eclipse和IntelliJ上工作,但还没有在NetBeans上工作。它还有其他一些痛苦的问题。
  2. 根据您的操作系统,即使您启动并运行此软件包,例如在Windows 8.1中,关闭端口也会出现问题。唯一的解决方案是重新启动IDE /控制台并重新连接。每次开发项目时,您都会疯狂地重新启动IDE。
  3. 我花了很多时间寻找解决方案,并没有正确关闭端口的解决方案,也许对于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的人。

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