用 DeepSeek 将 Modbus 协议文档自动化为 Qt 枚举与寄存器结构体?「文档解析+AI生成+编译验证」的代码工厂实践

第一步:把 PDF 或 Excel 寄存器表转成CSV

先人工用 Python 脚本(或者 WPS 另存为)把寄存器表转成统一 CSV,列名固定:`register_addr, register_name, register_type, enum_values, description`保持数据干净。

cpp 复制代码
# 假设你已经从 PDF 复制粘贴到了 excel.csv
import pandas as pd
df = pd.read_excel("modbus_table.xlsx")

# 清洗:去空行、去注释、统一列名
df = df.dropna(subset=["register_addr"])
df.to_csv("modbus_clean.csv", index=False)
print(f"清洗完成,共 {len(df)} 个寄存器")

注意:现场表格里经常有合并单元格,地址列是空的,但下面几行都引用。清洗时务必 `fillna(method='ffill')`,否则 AI 拿到错地址,生成的代码会出错。

第二步:写个 Prompt,让 DeepSeek产生Qt 头文件

把 prompt 写成「合同」,清晰列出输入 CSV 路径、输出头文件格式、枚举命名规则、结构体对齐方式。以下是稳定的 prompt 模板:

cpp 复制代码
// 你的项目里放个 prompt_template.txt
// 内容如下(用你实际 CSV 路径替换):
/*
你是 Qt 嵌入式专家。读取 modbus_clean.csv,生成 modbus_regs.h。
要求:

1. 每个 register_name 生成一个枚举常量,按地址升序排列。

2. 枚举名用驼峰,前缀 MODBUS_REG_。

3. 每个寄存器生成一个结构体成员,类型 uint16_t,注释写 description。

4. 枚举值与寄存器地址一一对应,禁止跳变。

5. 生成一个寄存表数组,按地址顺序排列。

6. 代码风格:Qt 5.15+,C++17,带 #pragma once。

7. 如果 enum_values 列非空,额外生成一个子枚举,名字为 寄存器名_Value。
*/

把 prompt 和 CSV 一起发给 DeepSeek API,拿到返回的 .h 文件内容。我通常直接存成 `modbus_regs.h`。

第三步:CMake 编译验证脚本

cpp 复制代码
# CMakeLists.txt 放在同目录下
cmake_minimum_required(VERSION 3.16)
project(modbus_gen_check)
set(CMAKE_CXX_STANDARD 17)

find_package(Qt5 REQUIRED COMPONENTS Core)
add_executable(check_main main.cpp)
target_include_directories(check_main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(check_main Qt5::Core)
cpp 复制代码
// main.cpp ------ 只包含头文件,静态断言检查枚举连续性
#include "modbus_regs.h"
#include <type_traits>

// 编译期检查:枚举按地址升序,且无重复
static_assert(MODBUS_REG_OFFSET < MODBUS_REG_MODE, "地址乱序!");
static_assert(MODBUS_REG_MODE < MODBUS_REG_STATUS, "地址乱序!");

int main() {
    // 故意引用一次,防止编译器优化掉
    volatile auto x = sizeof(modbus_reg_table);
    return x == 0; // 返回1表示表为空,会报错
}

如果编译出错,把错误信息返 DeepSeek,修改两轮后基本稳定。

注意:如果 AI 生成了大括号初始化数组,检查 C++11 的列表初始化是否满足,别用 C++14 特性,老编译器编译不过。

第四步:集成到 Qt 工程,加互斥锁和缓存,别让 UI 卡死

代码生成验证通过后,别直接裸奔。工业现场,寄存器读得太勤,UI 线程会卡。咱们包一层单例,带 `QReadWriteLock` 和 100ms 缓存,保证 7x24 稳定。

cpp 复制代码
// ModbusRegCache.h
class ModbusRegCache {
public:
    static ModbusRegCache& instance() {
        static ModbusRegCache c;
        return c;
    }
    uint16_t read(uint16_t addr) {
        QReadLocker locker(&m_lock);
        auto it = m_cache.find(addr);
        if (it != m_cache.end() && m_lastUpdate.elapsed() < 100) {
            return it.value();
        }
        // 实际走 Modbus 请求,这里省略
        uint16_t val = m_modbus->readRegister(addr);
        m_cache[addr] = val;
        m_lastUpdate.restart();
        return val;
    }
private:
    ModbusRegCache() : m_modbus(nullptr) {}
    QModbusClient* m_modbus; // 你自己的通信对象
    QHash<uint16_t, uint16_t> m_cache;
    QReadWriteLock m_lock;
    QElapsedTimer m_lastUpdate;
};

第五步:整个流程挂到 Git Hook 上,以后改文档自动触发

cpp 复制代码
#!/bin/bash

# auto_gen.sh ------ 一键生成+验证
python3 clean.py && \
python3 call_deepseek.py && \
cd build && cmake .. && make -j4
if [ $? -ne 0 ]; then
  echo "🚨 Modbus 头文件生成或编译失败,禁止提交!"
  exit 1
fi
相关推荐
小淮AI42 分钟前
告别水印困扰?2026年AI图像修复工具实测
人工智能
泛凡(Linyongui)1 小时前
第三篇、生命的bug分两种:一种是Flash坏了,一种是RAM乱了
人工智能·单片机·程序人生
OAK中国_官方1 小时前
在 OAK 上进行箱体尺寸测量:无需专用测量系统
人工智能·机器人·oak深度相机·箱体测量
恒锐丰小瑞1 小时前
率能SS8844T 40V/2.5A/四通道1/2H桥驱动芯片,IN/EN独立控制接口与低导通电阻(350mΩ),用于纺织机械/工业自动化/机器人
单片机·嵌入式硬件·机器人·自动化
网易云信1 小时前
AI 也要"背业绩":销售正在成为 Agent 落地的下一个黄金战场
人工智能·agent
博、、1 小时前
AI新零售线上商城系统实战开发指南:从架构设计到部署经验
人工智能·零售
帅哥的AI自修课1 小时前
模型幻觉检测与抑制技术-金融医疗双案例实战
人工智能·深度学习·金融
小女孩真可爱1 小时前
GPT(1)----------从零实现 GPT 模型以生成文本
人工智能·python·gpt·nlp
程序员cxuan1 小时前
一招让你的 Claude 被封了也能用
人工智能·后端·程序员