基于 Qt 6.8.1 开发的嵌入式固件升级工具,支持串口/网口双模式,可对 FPGA、DSP、ARM 等多种设备进行固件升级。
- 🔌 双通信模式 - 支持串口(RS232/USB-TTL)和网口(TCP)
- 🎯 多设备支持 - FPGA、DSP1、DSP2、ARM 四种设备类型
- 📦 实时进度 - 显示升级进度和详细状态信息
- 📝 日志记录 - 完整的通信日志,便于调试和问题排查
- 🔄 智能重试 - 自动超时检测和重传机制
BootLoader/
├── bin/ # 可执行文件目录
│ ├── BootLoader.exe # 编译后的可执行程序
│ ├── BootLoader 使用说明.md # 软件使用手册
│ └── bootloader.log # 运行日志文件(自动生成)
│
├── doc/ # 文档目录
│ └── BootLoader流程协议解析.md # 通信协议详细说明
│
├── gui/ # 界面设计文件
│ └── mainwindow.ui # Qt Designer UI 文件
│
├── inc/ # 头文件目录
│ ├── communication.h # 通信管理器类
│ ├── mainwindow.h # 主窗口类
│ ├── protocol.h # 协议解析类
│ └── upgrade.h # 升级管理器类
│
├── src/ # 源文件目录
│ ├── communication.cpp # 串口/TCP 通信实现
│ ├── main.cpp # 程序入口(含试用期验证)
│ ├── mainwindow.cpp # 主窗口实现
│ ├── protocol.cpp # 协议编码/解码实现
│ └── upgrade.cpp # 升级状态机实现
│
├── test/ # 测试工具目录
│ ├── test_TCP.py # TCP 网口测试服务器(模拟下位机)
│ └── test_COM.py # 串口测试服务器(模拟下位机)
│
├── BootLoader.pro # Qt 项目文件
├── README.md # 项目说明文档(本文件)
└── .gitignore # Git 忽略配置
负责底层串口和 TCP 通信
实现 BootLoader 协议的编码和解析
管理整个升级流程状态机
提供用户交互界面
- Qt 版本:6.8.1 或更高
- 编译器:MinGW 64-bit(Windows)
- IDE:Qt Creator 13.0+ 或 Visual Studio 2019+
- CMake:3.16+ (可选)
项目提供了两个 Python 测试脚本,用于模拟下位机响应,便于在没有实际硬件时进行功能测试。
模拟通过 TCP 网络连接的下位机。
模拟通过串口连接的下位机。
详细的通信协议请参考:doc/BootLoader流程协议解析.md
- 帧头:上位机
0xAA 0x55,下位机0x55 0xAA - 长度:大端序 2 字节,表示整帧长度
- 报文类型:区分请求、数据、结束等不同阶段
- 应答标识:上位机固定
0xFE,下位机表示执行状态 - CRC:CRC16-MODBUS,高位在前
上位机 下位机
| |
|--- 0x01 升级请求 ----------------------->|
|<-- 0x01 允许升级 (FLAG=0x04) ------------|
| |
|--- 0x02 系统复位 ----------------------->|
|<-- 0x02 重启成功 (FLAG=0x0C) ------------|
| |
|--- 0x06 FPGA升级指令 -------------------->|
|<-- 0x06 擦除Flash成功 (FLAG=0x0A) --------|
| |
|--- 0x07 FPGA数据包 1 -------------------->|
|<-- 0x07 命令执行成功 (FLAG=0x00) ---------|
|--- 0x07 FPGA数据包 2 -------------------->|
|<-- 0x07 命令执行成功 ---------------------|
| ... (循环发送所有数据包) |
| |
|--- 0x09 FPGA升级结束 -------------------->|
|<-- 0x09 所有数据包发送成功 (FLAG=0x0E) ---|
| |
| ... (DSP1, DSP2, ARM 同样流程) |
| |
|--- 0x10 总体结束 ------------------------>|
|<-- 0x10 命令执行成功 (FLAG=0x00) ---------|
| |
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 串口打开失败 | 端口被占用 | 关闭其他串口工具,重新插拔设备 |
| TCP 连接超时 | IP 或端口错误 | 检查 IP 配置,使用 ping 测试 |
| CRC 校验失败 | 通信干扰或数据损坏 | 降低波特率,减小数据包大小 |
| 升级超时 | 设备响应慢或未响应 | 检查设备状态,重启设备 |
- 启用日志:勾选日志功能,便于事后分析
- 降低速度:减小数据包大小(如 512),降低传输速率
- 隔离测试:先用测试脚本验证通信,再测试真实设备
- 检查硬件:确认线缆质量、接口牢固、供电稳定
- 在
protocol.h中添加新的报文类型常量 - 在
upgrade.cpp中的设备列表添加新设备 - 在
mainwindow.ui中添加对应的复选框和文件选择控件 - 更新状态机逻辑,添加新设备的升级流程
- 串口波特率:修改
communication.cpp中的openSerial()函数 - TCP 端口:修改界面默认值和
openTcp()函数 - 超时时间:修改
upgrade.cpp中的超时定时器时长
如需支持新的应答标识或报文类型,需同步修改:
protocol.h- 添加常量定义protocol.cpp- 更新描述映射函数upgrade.cpp- 更新状态机处理逻辑