# SerialDAQ **Repository Path**: bistu_liuning_admin_admin/SerialDAQ ## Basic Information - **Project Name**: SerialDAQ - **Description**: Qt串口数据采集系统 - 支持1ms高速采集、实时曲线、FFT分析、3D姿态显示 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-25 - **Last Updated**: 2026-03-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SerialPortTool - Qt串口数据采集系统 一个基于Qt 6的高性能串口数据采集、存储、可视化与分析工具,支持1ms级高速数据采集而不丢数。 ## 功能特性 - **高速串口采集**: 1ms级数据采集,采用多线程架构确保不丢数 - **实时曲线绘制**: 多通道数据实时显示,支持自定义样式 - **FFT频谱分析**: 自实现FFT算法,支持多种窗函数 - **3D姿态显示**: Qt 3D渲染的三维模型姿态可视化 - **数据存储**: 支持CSV/DAT/BIN三种格式异步存储 - **配置管理**: XML格式配置文件持久化 - **协议解析**: 支持多种协议配置,动态字段解析 - **协议选择**: 运行时切换不同解析协议 ## 技术架构 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ MainWindow │ │ (主窗口 - 整合所有功能模块) │ ├─────────────────────────────────────────────────────────────────────┤ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │SerialReceiveThread│ │DataStorageThread │ │ ConfigManager │ │ │ │ (串口接收线程) │ │ (数据存储线程) │ │ (配置管理) │ │ │ │ +ProtocolParser │ │ │ │ │ │ │ │ (协议解析DLL) │ │ │ │ │ │ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ │ │ │ │ │ ├───────────┴─────────────────────┴──────────────────────┴─────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │ │ │ ChartWidget │ │ FFTWidget │ │Model3DWidget │ │ Logger │ │ │ │ (曲线显示) │ │ (FFT分析) │ │ (3D模型显示) │ │ (日志) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ``` ## 1ms采集不丢数的关键技术 | 技术手段 | 实现方式 | 作用 | |---------|---------|------| | **多线程架构** | 串口接收/数据存储/配置管理各自独立线程 | UI线程不被阻塞 | | **生产者-消费者模式** | QQueue + QMutex + QWaitCondition | 数据安全传递 | | **条件变量等待** | `m_condition.wait(&m_mutex, 100)` | 高效唤醒,低CPU占用 | | **信号槽异步通信** | `Qt::QueuedConnection` | 跨线程安全通信 | | **环形缓冲** | 最大点数限制,超出自动移除旧数据 | 防止内存溢出 | ## 数据帧格式 ``` | 帧头(2B) | 帧长(1B) | 浮点数据(4N字节) | 校验(1B) | | 0x55AA | frameLen | float × N | checksum | ``` ## 协议解析 ### 支持的协议 程序通过加载 `hdntProtocolCore.dll` 解析数据,支持以下协议: | 协议 | 说明 | |------|------| | IEEE754 | IEEE754标准浮点 (支持动态通道) | | UINT16_HL | 16位无符号整数 (大端序) | | UINT16_LH | 16位无符号整数 (小端序) | | BMD | BMD标准协议 | | ... | 其他30+种协议 | ### 协议配置 协议配置文件位于 `protocols/` 目录: ``` protocols/ ├── IEEE754.json # IEEE754浮点协议 ├── UINT16_HL.json # UINT16大端序 ├── UINT16_LH.json # UINT16小端序 ├── BMD.json # BMD协议 └── ... ``` ### 协议选择 1. 在程序界面选择协议下拉框 2. 选择所需协议 3. 数据将按所选协议解析 ### 动态字段 对于变长数据(如IEEE754),使用动态字段: ```json { "fields": [ { "name": "data", "offset": 3, "size": 4, "type": 9, "bigEndian": 0, "repeat": 64, "repeatStep": 4 } ] } ``` - **repeat**: 最大通道数 - **repeatStep**: 每个通道的字节偏移 通道数自动计算:`(帧长 - 起始偏移) / 步进` ## 编译要求 - **Qt版本**: Qt 6.8.1 或更高版本 - **编译器**: MinGW 13.1.0 或 MSVC 2022 - **CMake**: 3.16+ (可选) - **Qt模块**: Core, Gui, Widgets, SerialPort, Charts, Concurrent, 3DCore, 3DRender, 3DInput, 3DExtras ## 编译步骤 本项目支持两种编译方式,均已验证通过。 ### 方式一:MinGW + qmake (推荐) 使用Qt自带的MinGW编译器和qmake构建系统。 ```powershell # 1. 设置环境变量 (根据实际Qt安装路径调整) $env:PATH = "C:\Qt\6.8.1\mingw_64\bin;C:\Qt\Tools\mingw1310_64\bin;" + $env:PATH # 2. 进入项目目录 cd D:\WorkProject\SoftSources_01_20260225\SerialDAQ # 3. 创建构建目录 mkdir build_mingw cd build_mingw # 4. 生成Makefile qmake ../SerialPortTool.pro -spec win32-g++ "CONFIG+=release" # 5. 编译 (使用4线程加速) mingw32-make -j4 # 6. 部署Qt运行时依赖 cd release windeployqt --release SerialPortTool.exe ``` **编译输出**: `build_mingw/release/SerialPortTool.exe` ### 方式二:MSVC 2022 + CMake 使用Visual Studio 2022的MSVC编译器和CMake构建系统。 ```powershell # 1. 设置环境变量 $env:PATH = "C:\Qt\6.8.1\msvc2022_64\bin;" + $env:PATH # 2. 进入项目目录 cd D:\WorkProject\SoftSources_01_20260225\SerialDAQ # 3. 创建构建目录 mkdir build cd build # 4. 生成Visual Studio项目 cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="C:/Qt/6.8.1/msvc2022_64" .. # 5. 编译Release版本 cmake --build . --config Release -j 4 # 6. 部署Qt运行时依赖 cd Release windeployqt --release SerialPortTool.exe ``` **编译输出**: `build/Release/SerialPortTool.exe` ## 运行 编译并部署Qt依赖后,需要部署协议解析DLL: ```powershell # 复制协议解析DLL到运行目录 copy hdntProtocolCore.dll .\build\Release\ # 复制协议配置文件 xcopy /E /I protocols .\build\Release\protocols\ # 运行程序 .\build\Release\SerialPortTool.exe ``` ## 项目结构 ``` SerialDAQ/ ├── CMakeLists.txt # CMake构建配置 ├── SerialPortTool.pro # qmake项目文件 ├── main.cpp # 程序入口 ├── mainwindow.h/cpp # 主窗口 ├── serialreceivethread.h/cpp # 串口接收线程 ├── datastoragethread.h/cpp # 数据存储线程 ├── chartwidget.h/cpp # 曲线显示控件 ├── fftwidget.h/cpp # FFT分析控件 ├── model3dwidget.h/cpp # 3D模型显示控件 ├── configmanager.h/cpp # 配置管理器 ├── logger.h/cpp # 日志系统 ├── protocols/ # 协议配置文件 │ ├── IEEE754.json │ └── ... ├── .gitignore # Git忽略配置 └── README.md # 说明文档 ``` ## 模块说明 ### SerialReceiveThread (串口接收线程) - 独立线程处理串口数据接收 - 生产者-消费者模式缓冲数据 - 帧头搜索与校验和验证 - 调用 hdntProtocolCore.dll 解析数据 - 支持协议动态切换 ### ProtocolParser (协议解析器) - 加载 hdntProtocolCore.dll - 从 protocols/ 文件夹加载协议配置 - 支持动态字段解析 - 提供详细的解析日志 ### DataStorageThread (数据存储线程) - 异步文件写入,不阻塞采集 - 支持CSV、DAT、BIN三种格式 - CSV: 带时间戳的逗号分隔文本文件 - DAT: 制表符分隔的纯数据文件 - BIN: 二进制浮点数据文件(每帧N个float,每个4字节) - 文件名自动以时间戳命名 ### ChartWidget (曲线显示控件) - 基于Qt Charts实现 - 50ms定时刷新 - 支持多通道选择 - 自定义线型、线宽、颜色 ### FFTWidget (FFT分析控件) - 自实现基2时间抽取FFT算法 - 支持256~4096点FFT - 4种窗函数: 矩形窗、汉宁窗、汉明窗、布莱克曼窗 - 频谱幅度dB显示 ### Model3DWidget (3D模型显示控件) - 基于Qt 3D渲染 - 飞机模型(机身+机翼+尾翼) - 通道数据映射到Roll/Pitch/Yaw - 支持角度偏移校准 ## 日志系统 程序运行日志保存在 `logs/` 目录: ``` logs/ └── log_20260307_120500.log ``` 日志内容包含: - DLL加载状态 - 协议列表 - 协议切换记录 - 数据解析结果 - 错误信息 ## 开源仓库 - **Gitee**: https://gitee.com/bistu_liuning_admin_admin/SerialDAQ ## 许可证 MIT License ## 作者 liuning ## 更新日志 ### v1.2.0 (2026-03-07) - 新增: BIN二进制文件存储功能 - 新增: 独立存储线程支持CSV/DAT/BIN三种格式 - 优化: BIN文件存储原始float数据,效率更高 ### v1.1.0 (2026-03-07) - 新增: 协议解析DLL集成 (hdntProtocolCore) - 新增: 协议选择UI - 新增: 动态字段支持 - 新增: 详细解析日志 - 修复: IEEE754字节序处理 ### v1.0.0 (2026-02-25) - 初始版本发布 - 实现串口数据采集、存储、绘制、FFT分析和3D显示功能 - 验证1ms采集不丢数 - 支持MinGW和MSVC两种编译方式