Java实现串口调试助手的步骤及代码,结合RXTX和jSerialComm(JSSC)两种常用库
一、环境配置
1. 库选择与依赖
-
RXTX(成熟,需本地库):
<dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId> <!-- 替代RXTX的新选择 --><version>2.6.2</version> </dependency>
-
jSerialComm(纯Java,推荐):
<dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>2.10.0</version> </dependency>
注意:RXTX需手动配置本地库(
.dll/.so
)路径。
二、核心功能实现
1. 扫描可用串口
// 使用jSerialComm
import com.fazecast.jSerialComm.*;
String[] ports = SerialPort.getCommPorts().stream().map(SerialPort::getSystemPortName).toArray(String[]::new);
System.out.println("可用串口:" + Arrays.toString(ports)); // 输出如 [COM1, COM3]
2. 打开串口并配置参数
SerialPort serialPort = SerialPort.getCommPort("COM1");
serialPort.openPort();
serialPort.setComPortParameters(9600, // 波特率8, // 数据位SerialPort.ONE_STOP_BIT, // 停止位SerialPort.NO_PARITY // 校验位
);
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, // 阻塞模式1000, // 读超时(毫秒)0 // 写超时
);
3. 数据接收(异步监听)
serialPort.addDataListener(new SerialPortDataListener() {@Overridepublic int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }@Overridepublic void serialEvent(SerialPortEvent event) {byte[] buffer = new byte[serialPort.bytesAvailable()];serialPort.readBytes(buffer, buffer.length);String data = new String(buffer);System.out.println("收到数据:" + data); // 实时打印接收数据}
});
4. 数据发送
String command = "AT\r\n";
byte[] bytes = command.getBytes();
serialPort.writeBytes(bytes, bytes.length); // 发送指令
5. 关闭串口
serialPort.closePort(); // 释放资源
三、进阶功能
1. 十六进制数据收发
// 发送十六进制数据
byte[] hexBytes = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello"
serialPort.writeBytes(hexBytes, hexBytes.length);// 接收数据转十六进制显示
StringBuilder hexStr = new StringBuilder();
for (byte b : buffer) {hexStr.append(String.format("%02X ", b));
}
System.out.println("十六进制数据:" + hexStr);
2. 多线程处理
// 接收线程避免阻塞UI
new Thread(() -> {while (serialPort.isOpen()) {if (serialPort.bytesAvailable() > 0) {// 处理数据}}
}).start();
3. 虚拟串口测试
- 工具推荐:VSPD(Virtual Serial Port Driver)创建虚拟串口对(如COM1<->COM2)。
- 自测流程: 创建虚拟端口对 本助手打开COM1发送数据 另一程序(如Python脚本)监听COM2并回复。
四、完整示例代码(jSerialComm)
import com.fazecast.jSerialComm.*;public class SerialDebugger {public static void main(String[] args) {SerialPort port = SerialPort.getCommPort("COM1");if (port.openPort()) {port.setComPortParameters(9600, 8, 1, 0);port.addDataListener(new SerialPortDataListener() {@Overridepublic void serialEvent(SerialPortEvent event) {byte[] data = new byte[port.bytesAvailable()];port.readBytes(data, data.length);System.out.println("RX: " + new String(data));}@Overridepublic int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }});// 发送测试指令port.writeBytes("AT\r\n".getBytes(), 4);}}
}
五、工具推荐
- 串口监控工具: Windows:AccessPort(捕获数据流) Linux:CuteCom(交互式调试)
- Java调试助手增强功能: 数据日志保存 自动发送周期指令 波形显示(传感器数据可视化)
资源:
- java 串口调试助手 源码 www.youwenfan.com/contentcnf/27622.html
- jSerialComm官方文档 fazecast.github.io/jSerialComm/
通过以上实现,可快速构建跨平台的串口调试工具,满足嵌入式开发、物联网设备调试等场景需求。