乐于分享
好东西不私藏

Excel填表到C代码自动生成,这套AUTOSAR工具太香了

Excel填表到C代码自动生成,这套AUTOSAR工具太香了

正文

上一篇推文发布后,很多小伙伴问:AUTOSAR的代码从哪开始看?

我的建议:从这个DBC代码生成器开始。

为什么?

  • 即学即用:填个Excel表,代码就自动生成了
  • 概念简单:就是CAN信号的打包解包
  • 工程实战:这是真实项目中用的工具

今天手把手教你用这个开源工具。


项目地址

GitHub:

https://github.com/xiaozhaodebug/STM32_AUTOSAR

DBC生成器位置:

tools/code_generators/├── dbc_generator.py          # Python生成器核心├── generate_dbc.sh           # 一键脚本(推荐)└── README_DBC_GENERATOR.md   # 详细文档

配置文件位置:

tools/config/XZ_CAN_V2.xlsx   # DBC配置表

三种使用方式

方式一:一键脚本(最简单,推荐)

cd STM32_AUTOSAR/tools# 一键完成:生成代码 + 编译 + 询问烧录./generate_dbc.sh

脚本自动完成:

  1. 读取 config/XZ_CAN_V2.xlsx
  2. 生成 include/DbcConfig.h
  3. 生成 src/utils/DbcHandler.c
  4. 生成 dbc_main_template.txt(参考模板)
  5. 编译工程
  6. 询问是否烧录

输出示例:

[INFO] 正在解析: XZ_CAN_V2.xlsx[INFO] 解析完成: 2 个消息, 7 个信号[INFO] TX 消息: 1 个[INFO] RX 消息: 1 个[INFO] 已生成: include/DbcConfig.h[INFO] 已生成: src/utils/DbcHandler.c[INFO] 已生成: dbc_main_template.txt

方式二:手动分步(想细粒度控制)

Step 1:生成代码

cd STM32_AUTOSAR/tools# 使用默认配置python3 dbc_generator.py --input config/XZ_CAN_V2.xlsx --output ../# 或使用自定义配置python3 dbc_generator.py --input /path/to/your_dbc.xlsx --output ../

依赖安装(如果报错):

pip3 install openpyxl

Step 2:查看生成的文件

生成3个文件:

文件
路径
用途
DbcConfig.h
include/
宏定义 + 数据结构 + 函数声明
DbcHandler.c
src/utils/
打包/解包函数实现
dbc_main_template.txt
根目录
main.c集成参考模板

Step 3:集成到main.c

参考生成的模板,在main.c中添加:

#include"DbcConfig.h"/* ========== 发送示例 ========== */staticuint32_t lastLedTx = 0;if ((gTickCount - lastLedTx) >= CYCLE_TIME_XZ_A_LED_STATE) {    lastLedTx = gTickCount;/* 1. 准备数据结构 */    XZ_A_LedState_t ledState = {0};    ledState.Led1_State = 1;  /* ON */    ledState.Led2_State = 2;  /* Blink *//* 2. 打包 */uint8_t txData[8];    Dbc_Pack_XZ_A_LedState(txData, &ledState);/* 3. 发送 */    CanMessage msg = {        .Id = MSG_ID_XZ_A_LED_STATE,        .IsExtId = 0,        .Dlc = 8    };memcpy(msg.Data, txData, 8);    CanDriver_Send(&msg, 10);}/* ========== 接收示例 ========== */switch (rxMsg.Id) {case MSG_ID_XZ_B_CTRL_STATE: {        XZ_B_CtrlState_t ctrl;        Dbc_Parse_XZ_B_CtrlState(rxMsg.Data, &ctrl);/* 使用解析后的数据 */if (ctrl.Ctrl_Cmd == 1) {/* 执行控制命令 */        }break;    }}

Step 4:编译烧录

cd buildcmake ..make -j4make flash

方式三:集成到CI/CD(自动化)

.github/workflows/dbc.yml:

name:GenerateDBCandBuildon: [push]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v2-name:GenerateDBCCoderun:|          cd tools          pip3 install openpyxl          python3 dbc_generator.py --input config/XZ_CAN_V2.xlsx --output ../-name:Buildrun:|          cd build          cmake ..          make -j4

Excel配置表怎么填

打开 tools/config/XZ_CAN_V2.xlsx,格式如下:

名称
示例
说明
A
Message ID
0x210
报文ID(Hex格式)
B
Message Name
XZ_A_Led_State
报文名称
C
Message Type
CAN_Standard
标准帧/扩展帧
D
Message Length
8
DLC长度(字节)
E
Send Type
Cyclic
周期/事件发送
F
Cycle Time
50
周期(ms)
G
Signal Name
Led1_State
信号名
H
Byte Order
intel
字节序
I
Signal Size
2
信号长度(bit)
J
Start Bit
0
起始位
K
Factor
1
精度(乘数)
L
Offset
0
偏移量
M
Init Value
0
初始值
N
Minimum
0
最小值
O
Maximum
3
最大值
P
Sender
XZ_A
发送节点
Q
Receiver
XZ_B
接收节点
R
Signal Group
Sig_Grp_0x210
信号组
S
Comment
LED状态
注释
T
Unit
单位
U
Coding
0x0:LED_ON
编码定义

行格式规则

消息行:A列填写ID(如0x210)

0x210 | XZ_A_Led_State | CAN_Standard | 8 | Cyclic | 50 | ...

信号行:A列留空,G列填信号名

      |                |              |   |        |    | Led1_State | intel | 2 | 0 | ...      |                |              |   |        |    | Led2_State | intel | 2 | 2 | ...

实战:添加一个新信号

  1. 打开 XZ_CAN_V2.xlsx
  2. 在对应报文下新增信号行
  3. 填写信号名、起始位、长度、收发节点
  4. 运行 ./generate_dbc.sh
  5. 代码自动生成,直接编译即可

不用改一行C代码!


生成的代码长啥样

DbcConfig.h(头文件)

/* 消息ID定义 */#define MSG_ID_XZ_A_LED_STATE     0x210   /* XZ_A -> XZ_B */#define MSG_ID_XZ_B_CTRL_STATE    0x211   /* XZ_B -> XZ_A *//* 周期定义 */#define CYCLE_TIME_XZ_A_LED_STATE 50/* 信号定义 */#define SIG_XZ_A_LED_STATE_LED1_STATE_START_BIT   0#define SIG_XZ_A_LED_STATE_LED1_STATE_SIZE        2#define SIG_XZ_A_LED_STATE_LED1_STATE_FACTOR      1#define SIG_XZ_A_LED_STATE_LED1_STATE_OFFSET      0/* 数据结构 */typedefstruct {uint8_t Led1_State;   /* 2bit, LED1状态 */uint8_t Led2_State;   /* 2bit, LED2状态 */uint8_t Led3_State;   /* 2bit, LED3状态 */uint8_t Led4_State;   /* 2bit, LED4状态 */} XZ_A_LedState_t;/* 函数声明 */voidDbc_Parse_XZ_B_CtrlState(constuint8_t* data, XZ_B_CtrlState_t* msg);voidDbc_Pack_XZ_A_LedState(uint8_t* data, const XZ_A_LedState_t* msg);

DbcHandler.c(实现文件)

/* 自动生成的打包函数 */voidDbc_Pack_XZ_A_LedState(uint8_t* data, const XZ_A_LedState_t* msg){if (data == 0 || msg == 0return;    data[0] = 0;    data[1] = 0;/* ... 清零 */    Dbc_SignalPack(data, msg->Led1_State, SIG_XZ_A_LED_STATE_LED1_STATE_START_BIT, SIG_XZ_A_LED_STATE_LED1_STATE_SIZE);    Dbc_SignalPack(data, msg->Led2_State, SIG_XZ_A_LED_STATE_LED2_STATE_START_BIT, SIG_XZ_A_LED_STATE_LED2_STATE_SIZE);/* ... 其他信号 */}/* 自动生成的解析函数 */voidDbc_Parse_XZ_B_CtrlState(constuint8_t* data, XZ_B_CtrlState_t* msg){if (data == 0 || msg == 0return;    msg->Ctrl_Cmd = (uint8_t)Dbc_SignalUnpack(data, SIG_XZ_B_CTRL_STATE_CTRL_CMD_START_BIT, SIG_XZ_B_CTRL_STATE_CTRL_CMD_SIZE);    msg->Ctrl_Val = (uint16_t)Dbc_SignalUnpack(data, SIG_XZ_B_CTRL_STATE_CTRL_VAL_START_BIT, SIG_XZ_B_CTRL_STATE_CTRL_VAL_SIZE);}

学习价值

通过这个工具,你能学到:

  1. CAN信号基础

    • StartBit、Length怎么算
    • Intel格式 vs Motorola格式
    • 量纲转换(Factor/Offset)
  2. 配置驱动思想

    • Excel配置到自动生成代码
    • 改配置不用改代码
    • 减少手写错误
  3. 代码生成原理

    • Python读取Excel
    • 模板生成C代码
    • 这在AUTOSAR中无处不在

常见问题

Q1: 运行报错 ModuleNotFoundError: No module named ‘openpyxl’

pip3 install openpyxl

Q2: 生成的代码编译报错

检查Excel格式:

  • Message ID必须以0x开头
  • Start Bit必须是数字
  • Signal Size必须是数字

Q3: 怎么判断TX还是RX

看Excel的Sender/Receiver列:

  • Sender填XZ_A到发送(TX)
  • Receiver填XZ_A到接收(RX)

Q4: 能支持Motorola格式吗

当前版本只支持Intel(小端)。如需Motorola,修改dbc_generator.py中的信号打包/解包逻辑。


资源领取

扫码关注,回复【AUTOSAR】领取:

  1. DBC配置Excel模板(带示例数据)
  2. 完整项目源码(STM32_AUTOSAR)
  3. 使用视频教程
  4. CAN矩阵设计规范

下期预告

DBC学会了,汽车诊断UDS怎么学?

下篇:《UDS诊断配置生成器:从Excel到诊断代码》

带你理解UDS诊断服务的自动生成!


关于我

我是小昭debug,在这里,我会持续分享一些嵌入式技术、职业干货,以及关于个人成长的思考,相信我这里的输出绝对都是实在的干货。

如果你平时也遇到过被卡住,或者想和同行一起抱团取暖,欢迎关注我。

后台发送 “2”,即可获取《车载嵌入式软件入门资料》。

添加微信并备注”进群”,我邀你加入高质量的学习交流群,大家一起成长!


关键词标签:DBC AUTOSAR CAN通信 代码生成 Python MCU 开源工具 汽车电子

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Excel填表到C代码自动生成,这套AUTOSAR工具太香了

猜你喜欢

  • 暂无文章