Java如何接入串口
了解RXTX包
最近工作有个需求是需要接入外部设备,通过串口获得外设数据信息。之前有简单接触过类似的需求,知道java下有个RXTX包是专门对各种外部设备进行数据通信的,于是在网上先查询了相关文档。
相关文档链接:
使用java进行串口开发测试
java使用RXTX的详细总结
Java程序与串口通信的实现及通信原码
看了这两个文档之后,就开始创建一个新的测试项目,根据文档的教学,对相关代码进行摘取测试
发现RXTX包的缺点,寻找更好的部署方案
在使用的过程中,遇到相当多的问题,比如RXTX这个包已经挺老的了,文档中的包下载地址很多已经过期,虽然通过通义或者DeepSeek等ai的询问会找到这个包的官方网站,但是看上述两篇文章中,RXTX除了相关jar包本体,win环境下还需要额外的dll文件放入jdk环境包下,我就比较担心这对后续的部署会比较麻烦。正好遇到bug通过通义千问了解问题时,ai给了我一个提示,有在RXTX基础上再封装的jar包,使用更加简易不需要本地部署修改,于是便将目光转向了JSSC包
了解JSSC包
了解到了有更加友好的解决方案后便对JSSC开始有所了解
(以上是通义千问对JSSC的介绍)
学习用JSSC包接入串口,并编写一个简易的demo
如何引用JSSC包(Maven环境,附非maven环境github地址)
目前(25年/02/06)在Maven Repository上能找的的pom版本只有如下这一个,所以并不存在版本问题
直接将上图中maven配置直接填入自己项目的pom即可
ps:如果并非是maven进行包管理,则可以从 JSSC 的 GitHub 页面进行下载
编写一个简易的串口监听代码
引入串口后便可以做一个简易的串口监听代码
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class JSSCListenerExample {
// 这里的代码也是参考了其他文章的代码,因为和RXTX的区别只在调用包不同和不需要本地环境
// 所以JSSC在代码中使用写法和RXTX可以说一摸一样
//创建串口连接对象
private static SerialPort serialPort;
public static void main(String[] args) {
// 替换为你要连接的串口号,例如 "COM1" 或 "/dev/ttyUSB0"
String portName = "COM1";
// 创建SerialPort对象
serialPort = new SerialPort(portName);
try {
// 打开串口
serialPort.openPort();
// 配置串口参数(波特率、数据位、停止位、校验位)
serialPort.setParams(
SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE
);
// 注册事件监听器
serialPort.addEventListener(new SerialPortReader());
// 设置串口读取超时时间(可选)
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN |
SerialPort.FLOWCONTROL_RTSCTS_OUT);
log.info("Waiting for incoming data...");
} catch (SerialPortException ex) {
log.error(ex.getMessage(), ex);
}
}
// 定义事件监听器
private static class SerialPortReader implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
byte buffer[] = serialPort.readBytes(event.getEventValue());
String receivedData = new String(buffer);
log.info("监听到了串口数据Received data: {}", receivedData);
} catch (SerialPortException e) {
log.error(e.getMessage(), e);
}
}
}
}
准备串口测试工具
这里需要准备两个串口调试工具
一个是串口虚拟化工具:VspdPro_CN_Free
还有一个是串口调试工具:XCOM
这两个工具直接搜索下载即可,因为时效性问题这里不放下载链接,我自己也尝试直接将标记的关键字放入搜索引擎是可以直接找到对应软件,没有问题。
这两个工具一个可以生成一对对应的虚拟串口(例如生成虚拟com1和com2,这两个串口可以互相监听对方,发送com1的请求可以通过com2监听到,反之亦然),一个可以监听端口或者向端口发送请求,非常好用。
Vspd新建都是一对,可以互相监听,串口建立好了就可以不用管了,不需要再删除端口即可
注意xcom在选择串口后,需要点击“串口操作:打开串口”那个按钮,按钮变红之后才算是链接上串口了
可以开两个xcom互相链接尝试发送接收都可以的情况在用代码测试
通过工具测试串口连通性
执行之前的代码会有如下的log,表示已经在挂起监听com1
"D:\Program Files\Java\jdk1.8.0_202\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Ultimate\lib\idea_rt.jar=11049:D:\Program Files\JetBrains\IntelliJ IDEA Ultimate\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;D:\workspace\comTest\target\classes;D:\Progarm Files\apache-maven-3.9.2\repository\cn\hutool\hutool-jwt\5.8.26\hutool-jwt-5.8.26.jar;D:\Progarm Files\apache-maven-3.9.2\repository\cn\hutool\hutool-json\5.8.26\hutool-json-5.8.26.jar;D:\Progarm Files\apache-maven-3.9.2\repository\cn\hutool\hutool-core\5.8.26\hutool-core-5.8.26.jar;D:\Progarm Files\apache-maven-3.9.2\repository\cn\hutool\hutool-crypto\5.8.26\hutool-crypto-5.8.26.jar;D:\workspace\comTest\lib\RXTXcomm.jar;D:\Progarm Files\apache-maven-3.9.2\repository\org\scream3r\jssc\2.8.0\jssc-2.8.0.jar;D:\Progarm Files\apache-maven-3.9.2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\Progarm Files\apache-maven-3.9.2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\Progarm Files\apache-maven-3.9.2\repository\org\slf4j\slf4j-log4j12\1.7.30\slf4j-log4j12-1.7.30.jar" org.example.main.utils.JSSCListenerExample
2025-02-06 17:31:30 INFO JSSCListenerExample:55 - Waiting for incoming data...
这时候就可以用XCOM以com2对com1发送测试文字
我这里中文没有做处理,所以日志里显示是乱码,如果需要传递中文切记在拿到byte后对字符调整