Java实现串口调试

Java实现串口调试助手的步骤及代码,结合RXTX和jSerialComm(JSSC)两种常用库

一、环境配置

1. 库选择与依赖

注意: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. 虚拟串口测试


四、完整示例代码(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调试助手增强功能: 数据日志保存 自动发送周期指令 波形显示(传感器数据可视化)

资源

专注于matlab/simulink,电子电路,编程