在 Java 中关闭串口问题

Close serial port issue in Java

我有以下 Java 代码:

import java.io.*;
import java.util.ArrayList;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

public class SerialCommDataReading implements SerialPortEventListener {
   private static SerialPort serialPort;
   private static final String PORT_NAME = "COM5";
   private BufferedReader input;
   private static final int TIME_OUT = 2000;
   private static final int DATA_RATE = 9600;

  public void initialize() {
    CommPortIdentifier portId = null;

    try {
        portId = CommPortIdentifier.getPortIdentifier(PORT_NAME);
        serialPort = (SerialPort) portId.open("GestureData", TIME_OUT);

        serialPort.setSerialPortParams(DATA_RATE,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);

        input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));

        System.out.println(input.read());

        serialPort.addEventListener(this);
        serialPort.notifyOnDataAvailable(true);
    } catch (Exception e) {
        System.err.println(e.toString());
    }
}

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            String inputLine = input.readLine();
            System.out.println(inputLine);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

public static void main(String[] args) throws Exception {
    SerialCommDataReading main = new SerialCommDataReading();
    main.initialize();
    Thread t = new Thread() {
        public void run() {
            try {
                Thread.sleep(1000000);
            } catch (InterruptedException ie) {
            }
        }
    };
    t.start();
    System.out.println("Started");
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            serialPort.close();
            serialPort.removeEventListener();
            System.out.println("Stopping");
        }
    });
}
}

代码可以很好地从串行端口获取数据。

problem/quesion:当我停止运行ning 代码时。它假设 运行 serialPort.close();和 serialPort.removeEventListener() 并且消息 Stopping 出现在控制台中。但是当我再次启动代码时,它说

gnu.io.NoSuchPortException

所以从逻辑上讲,我希望端口会关闭,这样我就可以重新启动代码而无需重新启动我的硬件设备,知道我遗漏了什么或做错了什么吗?

信息:我正在使用 Windows 8.1 64 位/通信基于蓝牙,它被模拟为带有 COM5 的串行端口。

注:代码来源于这里http://playground.arduino.cc/interfacing/java我已经修改了

我还没有找到在windows 8.1环境下关闭rxtx包串口的任何解决方案,因此我转移到JSSC包并且它工作得更好,完整的解决方案包括关闭端口和事件监听器可以在这里找到。

JSSC solution