# 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-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SerialPortTool - Qt串口数据采集系统 一个基于Qt 6的高性能串口数据采集、存储、可视化与分析工具,支持1ms级高速数据采集而不丢数。 ## 功能特性 - **高速串口采集**: 1ms级数据采集,采用多线程架构确保不丢数 - **实时曲线绘制**: 多通道数据实时显示,支持自定义样式 - **FFT频谱分析**: 自实现FFT算法,支持多种窗函数 - **3D姿态显示**: Qt 3D渲染的三维模型姿态可视化 - **数据存储**: 支持CSV/DAT格式异步存储 - **配置管理**: XML格式配置文件持久化 ## 技术架构 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ MainWindow │ │ (主窗口 - 整合所有功能模块) │ ├─────────────────────────────────────────────────────────────────────┤ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │SerialReceiveThread│ │DataStorageThread │ │ ConfigManager │ │ │ │ (串口接收线程) │ │ (数据存储线程) │ │ (配置管理) │ │ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ │ │ │ │ │ ├───────────┴─────────────────────┴──────────────────────┴─────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │ │ │ 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 | ``` ## 编译要求 - **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` **注意事项**: - 确保源文件不含BOM编码,否则MinGW编译会报错 - 如遇到BOM问题,可使用以下PowerShell脚本移除: ```powershell $bom = @(0xEF, 0xBB, 0xBF) Get-ChildItem -Include *.h,*.cpp -Recurse | ForEach-Object { $bytes = [System.IO.File]::ReadAllBytes($_.FullName) $start = 0 while ($start + 2 -lt $bytes.Length -and $bytes[$start] -eq $bom[0] -and $bytes[$start+1] -eq $bom[1] -and $bytes[$start+2] -eq $bom[2]) { $start += 3 } if ($start -gt 0) { $newBytes = New-Object byte[] ($bytes.Length - $start) [Array]::Copy($bytes, $start, $newBytes, 0, $newBytes.Length) [System.IO.File]::WriteAllBytes($_.FullName, $newBytes) } } ``` ### 方式二: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` ### 编译结果对比 | 编译方式 | 编译器 | 输出目录 | 可执行文件大小 | |---------|--------|---------|---------------| | MinGW + qmake | MinGW 13.1.0 | `build_mingw/release/` | ~214 KB | | MSVC + CMake | MSVC 2022 | `build/Release/` | ~xxx KB | ## 运行 编译并部署Qt依赖后,直接运行可执行文件: ```powershell # MinGW版本 .\build_mingw\release\SerialPortTool.exe # MSVC版本 .\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 # 日志系统 ├── .gitignore # Git忽略配置 └── README.md # 说明文档 ``` ## 模块说明 ### SerialReceiveThread (串口接收线程) - 独立线程处理串口数据接收 - 生产者-消费者模式缓冲数据 - 帧头搜索与校验和验证 - 支持浮点数据解析 ### DataStorageThread (数据存储线程) - 异步文件写入,不阻塞采集 - 支持CSV和DAT双格式 - 文件名自动以时间戳命名 ### ChartWidget (曲线显示控件) - 基于Qt Charts实现 - 50ms定时刷新 - 支持多通道选择 - 自定义线型、线宽、颜色 ### FFTWidget (FFT分析控件) - 自实现基2时间抽取FFT算法 - 支持256~4096点FFT - 4种窗函数: 矩形窗、汉宁窗、汉明窗、布莱克曼窗 - 频谱幅度dB显示 ### Model3DWidget (3D模型显示控件) - 基于Qt 3D渲染 - 飞机模型(机身+机翼+尾翼) - 通道数据映射到Roll/Pitch/Yaw - 支持角度偏移校准 ## 开源仓库 - **Gitee**: https://gitee.com/bistu_liuning_admin_admin/SerialDAQ ## 许可证 MIT License ## 作者 liuning (with GLM assistance) ## 更新日志 ### v1.0.0 (2026-02-25) - 初始版本发布 - 实现串口数据采集、存储、绘制、FFT分析和3D显示功能 - 验证1ms采集不丢数 - 支持MinGW和MSVC两种编译方式