Java实现串口调试

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() {
    @Override
    public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }
    @Override
    public 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() {
                @Override
                public void serialEvent(SerialPortEvent event) {
                    byte[] data = new byte[port.bytesAvailable()];
                    port.readBytes(data, data.length);
                    System.out.println("RX: " + new String(data));
                }
                @Override
                public int getListeningEvents() { 
                    return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; 
                }
            });
            // 发送测试指令
            port.writeBytes("AT\r\n".getBytes(), 4);
        }
    }
}

五、工具推荐

  1. 串口监控工具Windows:AccessPort(捕获数据流) Linux:CuteCom(交互式调试)
  2. Java调试助手增强功能: 数据日志保存 自动发送周期指令 波形显示(传感器数据可视化)

资源

  • java 串口调试助手 源码 www.youwenfan.com/contentcnf/27622.html
  • jSerialComm官方文档 fazecast.github.io/jSerialComm/
    通过以上实现,可快速构建跨平台的串口调试工具,满足嵌入式开发、物联网设备调试等场景需求。
posted @ 2025-09-01 16:00  小前端攻城狮  阅读(25)  评论(0)    收藏  举报