rxtx实现java串口通信,没有写GUI,可直接在命令行运行。
SerialTool类:串口操作方法的封装
package serialPort;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
/**
* 串口服务类 提供查找可用串口列表,打开,关闭,读取数据,添加监听器方法
* @author West
*
*/
public class SerialTool {
private static SerialTool serialTool = null;
static {
//当该类被ClassLoder加载时,初始化一个SerialTool对象
if (serialTool == null) {
serialTool = new SerialTool();
}
}
//私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象
private SerialTool() {}
/**
* 获取提供服务的SerialTool对象
* @return serialTool
*/
public static SerialTool getSerialTool() {
if (serialTool == null) {
serialTool = new SerialTool();
}
return serialTool;
}
/**
* 查找所有可用端口
* @return 可用端口列表
*/
public static final List<String> findPort() {
@SuppressWarnings("unchecked")
//获取当前所有可用端口列表
Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
List<String> portNameList = new ArrayList<>();
//将可用端口名添加到list并返回list
while (portList.hasMoreElements()) {
String portName = portList.nextElement().getName();
portNameList.add(portName);
}
return portNameList;
}
/**
* 打开串口
* @param portName 串口名
* @param baudrate 波特率
* @return 串口对象
* @throws UnsupportedCommOperationException
* @throws PortInUseException
* @throws NoSuchPortException
*/
public static final SerialPort openPort(String portName, int baudrate) throws UnsupportedCommOperationException, PortInUseException, NoSuchPortException {
//通过端口名识别端口
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
System.out.println(portName);
//打开端口(端口名,操作超时时间)
CommPort commPort = portIdentifier.open(portName, 2000);
System.out.println("123");
//判断是不是串口
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
//设置串口的参数
serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
System.out.println("open sucess锛�");
return serialPort;
}
return null;
}
/**
* 关闭串口
* @param serialport 待关闭的SerialPort对象
*/
public static void closePort(SerialPort serialPort) {
if (serialPort != null) {
serialPort.close();
serialPort = null;
}
}
/**
* 从串口读取数据
* @param serialPort 当前已建立连接的串口对象
* @return 字节数组
* @throws IOException
*/
public static byte[] readFromPort(SerialPort serialPort) throws IOException {
InputStream in = null;
byte[] bytes = null;
try {
in = serialPort.getInputStream();
// 获取buffer里的数据长度
int bufflenth = in.available();
while (bufflenth != 0) {
//初始化一个长度为buffer中数据长度的字节数组
bytes = new byte[bufflenth];
in.read(bytes);
bufflenth = in.available();
}
} catch (IOException e) {
System.out.println("IO读取异常");
} finally {
try {
if (in != null) {
in.close();
in = null;
}
} catch (IOException e) {
System.out.println("io关闭异常");
}
}
return bytes;
}
/**
* 添加监听器
* @param port 串口对象
* @param listener 串口监听器
* @throws TooManyListeners 监听类对象过多
*/
public static void addListener(SerialPort port, SerialPortEventListener listener) throws TooManyListenersException {
System.out.println("789");
//给串口添加监听器
port.addEventListener(listener);
//设置当有数据到达时唤醒监听接收线程
port.notifyOnDataAvailable(true);
//设置当通信中断时唤醒中断线程
port.notifyOnBreakInterrupt(true);
}
}
Data类:
package serialPort;
import java.util.List;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
public class Data {
private List<String> commList = null;
private SerialPort serialPort =null;
public Data(){
commList = SerialTool.findPort();
System.out.println(commList);
}
public void init(String portName,int bps){
try {
System.out.println("123");
//打开串口
serialPort = SerialTool.openPort(portName, bps);
System.out.println("456");
//添加监听器
SerialTool.addListener(serialPort, new SerialListener());
System.out.println("添加监听器成功");
} catch (Exception e) {
System.out.println("init初始化异常");
}
}
/**
* 监听器
* @author zz
*
*/
public class SerialListener implements SerialPortEventListener{
public void serialEvent(SerialPortEvent serialPortEvent){
System.out.println("开始监听");
switch (serialPortEvent.getEventType()) {
case SerialPortEvent.BI: // 10 通讯中断
System.out.println("与串口设备通信中断");
break;
case SerialPortEvent.OE: // 7 溢位(溢出)错误
case SerialPortEvent.FE: // 9 帧错误
case SerialPortEvent.PE: // 8 奇偶校验错误
case SerialPortEvent.CD: // 6 载波检测
case SerialPortEvent.CTS: // 3 清除待发送数据
case SerialPortEvent.DSR: // 4 待发送数据准备好了
case SerialPortEvent.RI: // 5 振铃指示
case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空
break;
case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据
byte[] data = null;
try {
if(serialPort == null){
System.out.println("串口对象为空!监听失败!");
} else {
data = SerialTool.readFromPort(serialPort);
if(data ==null || data.length<1){
System.out.println("读取数据过程中未获取到有效数据!");
System.exit(0);
} else {
System.out.println(new String(data).trim());
}
}
} catch (Exception e) {
System.out.println("监听异常!");
}
break;
default:
System.out.println("a");
break;
}
}
}
}
主函数类:
package serialPort;
import java.util.Scanner;
public class MainTest {
private static Scanner sc;
public static void main(String[] args){
//初始化data对象
Data data =new Data();
System.out.println(">>:");
sc = new Scanner(System.in);
String str =sc.nextLine();
data.init(str,9600);
System.out.println("over");
}
}