一.配置环境
1.配置本地环境
1.1下载依赖包
从分享的文件中找到rxtxSerial.dll和RXTXcomm.jar
1.2将rxtxSerial.dll文件添加到本地环境中<系统盘>\Windows\System32
1.3将rxtxSerial.dll文件添加到JAVA_HOME环境中
先进入cmd:
输入java -verbose查看本地java环境
找到本地jre环境:
将rxtxSerial.dll添加到jre的bin目录下:
1.3将RXTXcomm.jar添加到jre的lib下的ext目录下:
至此已完成本地资源的下载
2.将RXTXcomm.jar
和 log4j 依赖的 jar 包(jar文件夹内)加入到项目中:
3.将此模块编译成的 simple_serial_port.jar
加入到你的项目中,或者直接将该项目源码作为依赖库引入你的项目中
二.使用
1.查找可用串口
ArrayList<String> ports = SerialTool.findPort();
2.打开上面找到的串口
// 第一个参数用于给 serialPortVo 指定一个名字,便于识别不同的 serialPortVo ,可通过 serialPortVo.getName() 获取
// 打开上一步骤找到了串口集合中的第一个串口,可根据需求更改
SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(0), baudRate);
3.新建监听器继承 PortListener
父类并重写 onReceive()
和 onReadException()
方法,当串口接收到数据自动调用 onReceive()
方法,当接收数据时发生异常将调用 onReadException()
方法
4.绑定监听器并给串口发送数据
代码分析:
监听串口事件,特别是当串口有数据可用时,读取数据并进行后续处理。对于其他类型的串口事件(如通讯中断或错误),它会记录错误日志但没有其他操作。
- 在
switch
语句中,根据serialPortEvent.getEventType()
获取串口事件的类型:SerialPortEvent.BI
: 通讯中断,记录错误日志。SerialPortEvent.OE
、FE
、PE
、CD
、CTS
、DSR
、RI
、OUTPUT_BUFFER_EMPTY
: 这些事件暂时没有特别的处理,直接break
跳出。SerialPortEvent.DATA_AVAILABLE
: 串口存在可用数据,进行如下处理:- 通过
Thread.sleep(sleepTime)
延时一段时间,确保接收完整数据。 - 检查
serialPortVo.getSerialPort()
是否为null
,如果是则记录错误日志。 - 否则,调用
serialPortVo.readData()
方法读取数据,并将数据存入byte[] data
中。 - 最后调用
onReceive(data)
方法处理接收到的数据。 - 如果在读取数据时发生异常,通过
onReadException(e)
处理异常情况。
- 通过
public void serialEvent(SerialPortEvent serialPortEvent) {
switch (serialPortEvent.getEventType()) {
case SerialPortEvent.BI: // 10 通讯中断
logger.error("与串口设备通讯中断");
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 串口存在可用数据
try {
// 延时收到字符串一段时间,足够接收所有字节,以免出现字符串隔断
Thread.sleep(sleepTime);
byte[] data = null;
if (serialPortVo.getSerialPort() == null) {
logger.error("\n串口对象为空!监听失败!");
} else {
data = serialPortVo.readData(); // 读取数据,存入字节数组
onReceive(data);
}
} catch (Exception e) {
onReadException(e);
}
break;
}
}
代码分析:
主要作用是:
- 查找系统中的串口并列出。
- 打开指定的串口,并将一个自定义的串口监听器绑定到串口上。
- 这些操作都是串口通信中常见的基本步骤,用于与外部串口设备进行数据交互。
-
导入依赖:
java复制代码
import java.util.ArrayList;
- 导入 ArrayList 类,用于存储查找到的串口列表。
-
主方法:
java复制代码
public static void main(String[] args) throws SerialPortParameterFailure, PortInUse, NotASerialPort, NoSuchPort, TooManyListeners, SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {
main
方法是程序的入口点,抛出了多个异常,表明程序中可能涉及串口操作的异常处理。
-
查找可用串口:
java复制代码
ArrayList<String> ports = SerialTool.findPort(); System.out.println(ports);
SerialTool.findPort()
是一个自定义的方法,可能是用来查找当前系统中可用的串口,并将它们以字符串形式存储在ArrayList
中。System.out.println(ports);
打印出找到的串口列表,便于调试和确认。
-
打开指定串口:
java复制代码
SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(1), 9600);
SerialTool.openPort()
方法的作用是打开指定名称的串口,传入参数包括串口名称、串口地址(可能是系统分配的串口号)、波特率(这里是 9600)。- 返回一个
SerialPortVo
对象,可能是封装了串口操作的工具类或者实体类。
-
绑定串口监听器:
java复制代码
serialPortVo.bindListener(new MyListener(), 500);
serialPortVo.bindListener()
方法用于将自定义的串口监听器MyListener
绑定到打开的串口上,并设置超时时间为 500 毫秒。
-
打印调试信息:
java复制代码
System.out.println("h1"); System.out.println("h2");
- 打印两条调试信息,用于确认程序运行到了哪个步骤。
-
发送数据(被注释掉的代码):
java复制代码
//String reply = "我是在监听器类外面给你发送的消息"; //serialPortVo.sendData(reply.getBytes());
- 这部分代码被注释掉了,原本用于向串口发送数据。
reply.getBytes()
将字符串转换为字节数组发送给串口。
- 这部分代码被注释掉了,原本用于向串口发送数据。
public static void main(String[] args) throws SerialPortParameterFailure, PortInUse, NotASerialPort, NoSuchPort, TooManyListeners, SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {
//System.setProperty("spring.devtools.restart.enabled", "false");
ArrayList<String> ports = SerialTool.findPort();
System.out.println(ports);
SerialPortVo serialPortVo = SerialTool.openPort("我是dtu的串口", ports.get(1), 9600);
System.out.println("h1");
serialPortVo.bindListener(new MyListener(), 500);
System.out.println("h2");
//String reply = "我是在监听器类外面给你发送的消息";
//serialPortVo.sendData(reply.getBytes());
}
}