/Graduation_Project

基于Qt与STM32平台开发的汽车车机系统上位机 & 常见类型汽车传感器信号模拟发生器

Primary LanguageC++GNU General Public License v3.0GPL-3.0

基于Qt的传感器数据采集和可视化软件说明书

软件介绍

本软件是一款基于Qt框架的C++应用程序,主要功能是通过串口采集传感器数据并进行可视化展示。软件实现了数据动态绘图、数据保存和自定义协议解析等功能,适用于传感器数据的实时监控和分析。

主窗口模块(Main Window Module)

文件: main.cpp, mainwindow.cpp, mainwindow.h, mainwindow.ui

功能: 启动应用程序并初始化主窗口。设置用户界面,包含串口选择、数据展示和绘图区域。实现界面与用户的交互操作。

详细说明:

  • main.cpp中,程序入口函数创建一个QApplication对象,并实例化MainWindow对象,显示主窗口。
  • mainwindow.cpp中,MainWindow类的构造函数初始化界面组件,设置串口通信和数据绘图功能,并通过信号和槽机制实现交互功能。
  • mainwindow.ui中定义了主窗口的界面布局,包含按钮、文本框、下拉菜单和绘图区域。

操作步骤:

  1. 双击应用程序图标启动程序。
  2. 程序启动后,您将看到主窗口界面,界面上有串口选择框、数据展示区域和绘图区域。

串口通信模块(Serial Communication Module)

文件: mainwindow.cpp

功能: 扫描并列出可用的串口设备。通过串口接收传感器数据。

详细说明:

  • 使用QSerialPort类实现串口通信。
  • 在主窗口初始化时,扫描所有可用的串口设备并将其添加到下拉菜单中供用户选择。
  • 连接选定的串口,并通过信号和槽机制读取数据,当串口有数据可读时,自动调用readData()函数读取数据。

操作步骤:

  1. 在主窗口的串口选择框中,点击下拉菜单选择一个可用的串口设备。
  2. 选择串口设备后,点击“连接”按钮,程序将自动开始接收传感器数据。

数据可视化模块(Data Visualization Module)

文件: mainwindow.cpp, qcustomplot.cpp

功能: 使用QCustomPlot绘制数据图表。支持动态绘图,实时更新数据。

详细说明:

  • mainwindow.cpp中,使用QCustomPlot类创建绘图区域,并设置其交互功能,如拖动、缩放和选择。
  • 实现了动态绘图功能,通过QTimer定时器定期更新绘图数据,实现实时显示。
  • 用户可以通过界面按钮控制绘图的开始和暂停,并可保存绘图结果为PNG图片。

操作步骤:

  1. 点击“开始”按钮,启动数据的动态绘图,图表区域将显示实时更新的传感器数据曲线。
  2. 点击“暂停”按钮,停止绘图。

数据解析模块(Data Parsing Module)

文件: protocol.cpp

功能: 自定义数据协议解析。将接收到的原始数据解析为可视化数据。

详细说明:

  • protocol.cpp中实现了数据解析逻辑,定义了Sensor_Data结构体用于存储解析后的数据。
  • 使用qRegisterMetaType注册数据类型,确保数据在信号槽机制中传递的正确性。

数据保存模块(Data Saving Module)

文件: mainwindow.cpp

功能: 保存传感器数据到CSV文件。保存绘制的图表为PNG图片。

详细说明:

  • 在主窗口中提供了保存按钮,用户可以选择将数据保存为CSV文件或将当前绘制的图表保存为PNG图片。
  • 使用QFileDialog提供文件选择对话框,选择保存路径和文件类型。

操作步骤:

  1. 点击“保存”按钮。
  2. 在弹出的文件选择对话框中,选择保存路径和文件类型(PNG或CSV)。
  3. 点击“保存”按钮,数据或图表将保存到指定位置。

Pressure Module

文件: pressure.cpp

功能: 模拟和显示不同类型的压力波形。提供启动、停止、重置和保存/加载配置的功能。

详细说明:

UI组件初始化

文件: pressure.cpp

功能: 初始化用户界面组件,包括按钮、滑块和标签。设置布局并连接信号和槽。

详细说明:

  • 创建并初始化按钮(开始、停止、重置、保存、加载)和标签(当前压力、峰值压力)。
  • 初始化频率滑块和波形选择器,并设置其范围和默认值。
  • 将组件添加到布局中并设置布局。
  • 连接按钮和滑块的信号到对应的槽函数。

操作步骤:

  1. 打开软件后,在波形选择器下拉菜单中选择波形类型(正弦波、锯齿波或方波)。
  2. 使用频率滑块调整波形更新的频率,滑块范围为10到1000。
  3. 点击“开始”按钮,启动波形模拟。压力数据将以选定的波形类型和频率生成,并实时显示在界面上。
  4. 点击“停止”按钮,停止波形模拟。
  5. 点击“重置”按钮,清空当前压力数据和峰值压力,界面显示复位。
  6. 点击“保存配置”按钮,将当前波形类型和频率设置保存到pressure_config.txt文件。
  7. 点击“加载配置”按钮,从pressure_config.txt文件加载波形类型和频率设置,并更新界面组件。

Speed Module

文件: speed.cpp

功能: 模拟和控制速度。提供启动、停止和紧急停止功能。

详细说明:

UI组件初始化

文件: speed.cpp

功能: 初始化用户界面组件,包括滑动条、标签、下拉菜单和按钮。设置组件布局并连接信号和槽。

详细说明:

  • 创建并初始化滑动条,设置其范围为0到3000,用于调节速度。
  • 创建并初始化标签,用于显示当前速度。
  • 创建并初始化预设速度下拉菜单,包含三个预设值(1000 RPM、2000 RPM、3000 RPM)。
  • 创建并初始化按钮(开始、停止、紧急停止)。
  • 连接滑动条和按钮的信号到对应的槽函数,实现速度更新和命令发送。

操作步骤:

  1. 使用滑动条调节速度,标签将实时显示当前速度值。
  2. 通过预设速度下拉菜单选择固定速度。
  3. 点击“开始”按钮,发送启动命令,开始速度控制。
  4. 点击“停止”按钮,发送停止命令,停止速度控制。
  5. 点击“紧急停止”按钮,发送紧急停止命令,立即停止速度控制。

Temperature Module

文件: temperature.cpp

功能: 模拟温度变化。提供不同场景下的温度变化模拟。

详细说明:

UI组件初始化

文件: temperature.cpp

功能: 初始化用户界面组件,包括滑动条、标签、进度条、下拉菜单和按钮。设置组件布局并连接信号和槽。

详细说明:

  • 创建并初始化滑动条,设置其范围为0到100,用于调节温度。
  • 创建并初始化标签,用于显示当前温度。
  • 创建并初始化进度条,用于显示温度的变化。
  • 创建并初始化场景选择下拉菜单,包含三个预设场景(一般启动、高负载启动、冷启动)。
  • 创建并初始化按钮(开始、停止)。
  • 连接滑动条和按钮的信号到对应的槽函数,实现温度更新和模拟控制。

操作步骤:

  1. 使用滑动条调节温度,标签和进度条将实时显示当前温度值。
  2. 从场景选择下拉菜单中选择不同的温度变化场景(一般启动、高负载启动、冷启动)。
  3. 点击“开始”按钮,启动温度模拟。温度数据将根据选定的场景变化,并实时显示在界面上。
  4. 点击“停止”按钮,停止温度模拟。

使用说明

  1. 启动软件:

    • 运行程序后,主界面将显示可用的串口设备。
    • 从下拉菜单中选择一个串口设备并进行连接。
  2. 接收数据:

    • 连接串口后,程序将自动开始接收传感器数据。
    • 数据将实时显示在主界面的文本区域中。
  3. 绘制图表:

    • 点击“开始”按钮,启动数据的动态绘图。
    • 图表区域将显示实时更新的传感器数据曲线。
    • 点击“暂停”

按钮,停止绘图。

  1. 保存数据:

    • 点击“保存”按钮,选择保存路径和文件类型(PNG或CSV)。
    • 数据或图表将保存到指定位置。
  2. 清除数据:

    • 点击“清除”按钮,清空当前显示的数据。

注意事项

  • 确保在使用前已正确连接传感器设备,并选择正确的串口。
  • 数据保存时,请选择合适的文件类型和路径,以免数据丢失。
  • 在使用动态绘图功能时,确保计算机性能能够支持实时数据更新。

示例

启动和停止温度模拟示例:

Temperature *temperatureWidget = new Temperature(parent);
temperatureWidget->show();
temperatureWidget->startSimulation();  // 启动温度模拟
// ... 进行一些操作
temperatureWidget->stopSimulation();  // 停止温度模拟

调节温度示例:

temperatureWidget->temperatureSlider->setValue(50);  // 设置滑动条值为50°C

切换场景示例:

temperatureWidget->scenarioSelector->setCurrentIndex(1);  // 选择高负载启动场景