在 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
我有以下 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