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
脚本自动完成:
-
读取 config/XZ_CAN_V2.xlsx -
生成 include/DbcConfig.h -
生成 src/utils/DbcHandler.c -
生成 dbc_main_template.txt(参考模板) -
编译工程 -
询问是否烧录
输出示例:
[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个文件:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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列填写ID(如0x210)
0x210 | XZ_A_Led_State | CAN_Standard | 8 | Cyclic | 50 | ...
信号行:A列留空,G列填信号名
| | | | | | Led1_State | intel | 2 | 0 | ... | | | | | | Led2_State | intel | 2 | 2 | ...
实战:添加一个新信号
-
打开 XZ_CAN_V2.xlsx -
在对应报文下新增信号行 -
填写信号名、起始位、长度、收发节点 -
运行 ./generate_dbc.sh -
代码自动生成,直接编译即可
不用改一行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 == 0) return; 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 == 0) return; 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);}
学习价值
通过这个工具,你能学到:
-
CAN信号基础
-
StartBit、Length怎么算 -
Intel格式 vs Motorola格式 -
量纲转换(Factor/Offset) -
配置驱动思想
-
Excel配置到自动生成代码 -
改配置不用改代码 -
减少手写错误 -
代码生成原理
-
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】领取:
-
DBC配置Excel模板(带示例数据) -
完整项目源码(STM32_AUTOSAR) -
使用视频教程 -
CAN矩阵设计规范

下期预告
DBC学会了,汽车诊断UDS怎么学?
下篇:《UDS诊断配置生成器:从Excel到诊断代码》
带你理解UDS诊断服务的自动生成!
关于我
我是小昭debug,在这里,我会持续分享一些嵌入式技术、职业干货,以及关于个人成长的思考,相信我这里的输出绝对都是实在的干货。
如果你平时也遇到过被卡住,或者想和同行一起抱团取暖,欢迎关注我。
后台发送 “2”,即可获取《车载嵌入式软件入门资料》。
添加微信并备注”进群”,我邀你加入高质量的学习交流群,大家一起成长!
关键词标签:DBC AUTOSAR CAN通信 代码生成 Python MCU 开源工具 汽车电子
夜雨聆风