Java串口通信上位机:多传感器数据采集与Excel存储

随着物联网技术的不断发展,越来越多的传感器被广泛应用于各个领域,如环境监测、健康监测、工业自动化等。这些传感器通常通过串口与上位机进行数据通信。本文将介绍如何使用Java实现一个串口通信上位机,采集加速度传感器、温湿度传感器等多传感器的数据,并将实时采集的数据存储到Excel文件中。此外,还将支持波特率配置、校验位设置以及日志分级管理,适用于物联网数据采集与存储场景。

一、系统概述

本项目旨在通过串口与多个传感器进行通信,实现以下功能:

  • 数据采集:通过串口接口接收加速度传感器、温湿度传感器的数据。

  • 协议解析:解析传感器发送的数据格式(如ASCII编码)。

  • Excel存储:将采集到的数据实时写入Excel文件。

  • 配置管理:提供波特率、校验位等串口参数配置功能。

  • 日志管理:实现日志分级管理,记录程序运行时的各种事件。

二、技术选型

  1. 串口通信:Java通过 javax.commjSerialComm 等库来实现串口通信。jSerialComm 是一个跨平台的库,支持Windows、Linux和Mac系统,易于集成。

  2. Excel存储:利用 Apache POI 库来操作Excel文件,支持创建、读取和写入Excel。

  3. 日志管理:使用 SLF4J 配合 Logbacklog4j 来进行日志记录,支持不同级别的日志输出(如DEBUG、INFO、ERROR等)。

三、系统架构

系统由以下几个主要模块组成:

  1. 串口通信模块:负责与传感器通过串口进行通信,接收传感器数据。

  2. 协议解析模块:负责解析传感器传输的数据(如ASCII编码),并转换成可读的数值。

  3. 数据存储模块:将解析后的数据实时存储到Excel文件中。

  4. 配置管理模块:允许用户配置波特率、校验位等串口通信参数。

  5. 日志管理模块:记录程序运行过程中的各类信息,包括错误、警告、信息和调试日志。

四、实现步骤

1. 串口通信模块

1.1 引入 jSerialComm

首先,需要在项目中引入 jSerialComm 库,以便进行串口通信。可以通过Maven来引入:

<dependency>
    <groupId>com.fazecast</groupId>
    <artifactId>jSerialComm</artifactId>
    <version>2.6.2</version>
</dependency>
1.2 初始化串口

在串口通信模块中,首先需要列出可用的串口并初始化串口通信设置(波特率、校验位、数据位、停止位等)。

import com.fazecast.jSerialComm.SerialPort;

public class SerialCommunication {
    private SerialPort comPort;

    public void initSerialPort(String portName, int baudRate, int dataBits, int stopBits, int parity) {
        comPort = SerialPort.getCommPort(portName);
        comPort.setBaudRate(baudRate);
        comPort.setNumDataBits(dataBits);
        comPort.setNumStopBits(stopBits);
        comPort.setParity(parity);

        if (comPort.openPort()) {
            System.out.println("串口连接成功!");
        } else {
            System.out.println("串口连接失败!");
        }
    }

    public void closePort() {
        if (comPort != null && comPort.isOpen()) {
            comPort.closePort();
        }
    }
}

2. 协议解析模块

在本项目中,假设传感器的数据采用ASCII编码格式。以下是一个简单的协议解析示例,将接收到的数据转换为相应的数值:

2.1 数据解析
public class ProtocolParser {

    public SensorData parseData(String data) {
        // 假设数据格式为:"ACCL:23.5, TEMP:22.3, HUM:55"
        String[] tokens = data.split(", ");
        double acceleration = Double.parseDouble(tokens[0].split(":")[1]);
        double temperature = Double.parseDouble(tokens[1].split(":")[1]);
        double humidity = Double.parseDouble(tokens[2].split(":")[1]);

        return new SensorData(acceleration, temperature, humidity);
    }
}

class SensorData {
    private double acceleration;
    private double temperature;
    private double humidity;

    public SensorData(double acceleration, double temperature, double humidity) {
        this.acceleration = acceleration;
        this.temperature = temperature;
        this.humidity = humidity;
    }

    // getters and setters
    public double getAcceleration() {
        return acceleration;
    }

    public double getTemperature() {
        return temperature;
    }

    public double getHumidity() {
        return humidity;
    }
}

3. 数据存储模块

3.1 使用 Apache POI 进行 Excel 操作

首先需要在项目中引入 Apache POI 库:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>

然后,可以将解析后的数据写入Excel文件:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelStorage {

    private Workbook workbook;
    private Sheet sheet;
    private int rowCount;

    public ExcelStorage() {
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet("Sensor Data");
        rowCount = 0;

        // 添加表头
        Row headerRow = sheet.createRow(rowCount++);
        headerRow.createCell(0).setCellValue("Time");
        headerRow.createCell(1).setCellValue("Acceleration");
        headerRow.createCell(2).setCellValue("Temperature");
        headerRow.createCell(3).setCellValue("Humidity");
    }

    public void writeData(SensorData data) throws IOException {
        Row row = sheet.createRow(rowCount++);
        row.createCell(0).setCellValue(System.currentTimeMillis());
        row.createCell(1).setCellValue(data.getAcceleration());
        row.createCell(2).setCellValue(data.getTemperature());
        row.createCell(3).setCellValue(data.getHumidity());

        try (FileOutputStream fileOut = new FileOutputStream("SensorData.xlsx")) {
            workbook.write(fileOut);
        }
    }
}

4. 配置管理模块

为了灵活配置串口通信参数,可以设计一个配置文件或图形界面供用户设置:

public class SerialPortConfig {
    private int baudRate;
    private int dataBits;
    private int stopBits;
    private int parity;

    // Getters and Setters
    public int getBaudRate() {
        return baudRate;
    }

    public void setBaudRate(int baudRate) {
        this.baudRate = baudRate;
    }

    // 同理为 dataBits, stopBits 和 parity 添加getter和setter方法
}

5. 日志管理模块

使用 SLF4JLogback 进行日志管理。

引入依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.32</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

然后在代码中进行日志记录:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerManager {
    private static final Logger logger = LoggerFactory.getLogger(LoggerManager.class);

    public void logInfo(String message) {
        logger.info(message);
    }

    public void logError(String message) {
        logger.error(message);
    }
}

五、总结

通过本项目,您可以实现一个基于Java的串口通信上位机,能够实时采集多个传感器(如加速度、温湿度传感器)的数据,并将其存储到Excel文件中。此外,项目还支持波特率、校验位的配置,以及日志分级管理功能。该系统适用于物联网数据采集与存储场景,具有较好的扩展性和应用前景。