# pydbcc **Repository Path**: openes/pydbcc ## Basic Information - **Project Name**: pydbcc - **Description**: Python解析DBC,并生成C代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 8 - **Created**: 2024-04-01 - **Last Updated**: 2025-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python解析DBC,并生成C代码 ### 使用方法 * 修改输入输出 ``` FILE_INPUT = "Demo.dbc" FILE_OUTPUT = "example" ``` * 执行命令: ``` python dbcc.py ``` * 根据需求修改 .h 文件,使能需要解析的CAN消息 ``` #define ENABLE_ID_XXX ``` * 调用 decode_can_msg() 函数,将 CAN 消息数据传入即可实现解析功能 * 解析后的结果会存储在全局变量中,在 .h 文件中的 API 部分以 extern 方式声明供外部使用 ### DBC 简介 * DBC(Data Base CAN)文件是由德国 Vector 公司发布的,它被用来描述 CAN 网络中各逻辑节点信息,依据该文件可以开发出来监视和分析 CAN 网络中所有逻辑节点的运行状态。 ### 关键字 * 先来概括的了解一下 DBC 文件中的关键字 | 关键字 | 概述 | |---|---| | VERSION | 版本 | | NS_ | 新符号(New Symbol),后面紧跟着一堆 ns,一般是创建 dbc 时自动生成,不用太关心 | | BS_ | 定义 CAN 网络的波特率定义 | | BU_ | 网络节点定义 | | BO_ | 报文帧定义 | | SG_ | 信号定义 | | CM_ | 对报文/信号的注解 | | BA_DEF_ | 对报文/信号/节点等的属性定义 | | BA_DEF_DEF_ | 对报文/信号/节点等的属性初始值定义 | | BA_ | 对报文/信号/节点等的属性设置值定义 | | VAL_ | 数值表定义 | | VAL_TABLE_ | 全局信号值表,用来对信号值解码 | | EV_ | 环境变量 | ### VERSION & NS_ * 版本与新符号定义 * 示例: ``` VERSION "" NS_ : NS_DESC_ CM_ BA_DEF_ BA_ VAL_ CAT_DEF_ CAT_ FILTER BA_DEF_DEF_ EV_DATA_ ENVVAR_DATA_ SGTYPE_ SGTYPE_VAL_ BA_DEF_SGTYPE_ BA_SGTYPE_ SIG_TYPE_REF_ VAL_TABLE_ SIG_GROUP_ SIG_VALTYPE_ SIGTYPE_VALTYPE_ BO_TX_BU_ BA_DEF_REL_ BA_REL_ BA_DEF_DEF_REL_ BU_SG_REL_ BU_EV_REL_ BU_BO_REL_ SG_MUL_VAL_ ``` * 开头是 VERSION 和 NS_ 两个标签,VERSION 信息可以为空,也可以由用户自定义;NS_ 信息在创建 dbc 的时候自动生成,内容无需关心。 ### BS_ * CAN 网络的波特率定义 * 格式如下: ``` BS_:[baudrate:BTR1,BTR2]; ``` * 解释: * BS_ 为关键字,用于定义CAN网络的波特率; * `[` `]` 内容表示为可选部分,可以省略(如下面示例中即把该部分省略了),但关键字 BS_: 必须存在,省略则会出错。 * 示例: ``` BS_: ``` ### BU_ * 网络节点定义 * 格式如下: ``` BU_: Nodename1 Nodename2 …… ``` * 解释: * BU_ 为关键字,表示网络节点定义 * Nodename1、Nodename2 网络节点名字,由用户自己定义,注意:需要保证节点命名的唯一性 * 示例: ``` BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX ``` * 上面示例中,定义了 VCU_Vehicle_Control_Unit、MotorCtrol、SCU、PC 和 Vector__XXX 5 个网络节点 ### BO_ * 报文帧定义 * 格式如下: ``` BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter ``` * 解释: * BO_ 为关键字,表示报文帧定义 * MessageId 报文 ID,是以 10 进制数表示的(如示例中的996,代表报文 ID 是 0x3E4,也就是 CAN ID 的值) * MessageName 报文的名字,命名规则和 C 语言变量相同 * MessageSize 报文数据域字节数,为无符号整型数据,CAN 2.0 为最大 8 字节,CAN FD 最大 64 字节 * Transmitter 该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为 "Vector__XXX" * 示例: ``` BO_ 996 MSG1: 8 VCU_Vehicle_Control_Unit ``` * 上面示例解析如下: * 报文ID: 996(0x3E4) * 报文名: MSG1 * 分隔符 ":" * 报文长度: 8 字节 * 报文发送者: VCU_Vehicle_Control_Unit ### SG_ * 信号定义 * 格式如下: ``` SG_ SignalName(SigTypeDefinition) : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver ``` * 解释: * SG_ 为关键字,表示信号定义 * SignalName(SigTypeDefinition) : 表示该信号的名字和多路选择信号的定义 * SigTypeDefinition 是可选项,有 3 种格式: * 空,表示普通信号 * M,表示多路选择器信号 * m50,表示被多路选择器选择的信号,50,表示当 M 定义的信号的值等于 50 的时候,该报文使用此通路 * StartBit、SignalSize 表示该信号起始位、信号长度 * ByteOrder 表示信号的字节顺序:0 代表 Motorola 格式,1 代表 Inter 格式 * ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数 * Factor,Offset 表示因子,偏移量;这两个值用于信号的原始值与物理值之间的转换。转换如下:物理值=原始值\*因子+偏移量 * Min、Max 表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为 double 类型 * Unit 表示该信号的物理单位,为字符串类型 * Receiver 表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为 "Vector__XXX" * 示例: ``` SG_ S_Check : 45|10@0+ (0.00625,0) [0|160] "M" EL3160_60,ESC ``` * 如上面的示例,表示定义了一个命名为 S_Check 的普通信号,其起始位是第 45 位,信号长度 10 bit;信号是 Motorola 格式,数值类型为无符号类型数;因子为 0.00625,偏移量为 0;信号取值范围为 0 到 160;信号物理单位为字符串 "M";该信号接收节点 为 EL3160_60, ESC 这两个节点。 ### CM_ * 对报文/信号的注解 * 示例: ``` CM_ SG_ 996 HUD_HeightLv "Control hud height level" ``` * 格式如下: ``` CM_ Object MessageId/NodeName "Comment" ``` * 解释: * CM_ 为关键字,表示注解信息; * Object 表示进行注解的对象类型,可以是节点 BU_、报文 BO_、或消息 SG_; * MessageId/NodeName 表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);若前面的对象类型为节点,则这里的值应为节点的名字; * Comment 表示进行注解的文本信息; * 如上面的示例,表示对 ID 为 996(0x3E4) 这条报文下的名为 "HUD_HeightLv" 的信号进行注解说明,说明的内容为 "Control hud height level"。 * 又如 CM_ BU_ HUD “Head Up Display"; 表示对 HUD 这个节点进行注解说明,说明的内容为 "Head Up Display"。 * 注释以 "" 包围,注释内部不允许出现 " 号。 ### BA_DEF_ * 对报文/信号/节点等的属性定义 * 示例: ``` BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65535; ``` * 格式如下: ``` BA_DEF_ Object AttributeName ValueType Min Max; ``` * 解释: * BA_DEF_ 为关键字,表示属性定义; * Object 属性定义的对象,可以是 BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义); * AttributeName 特征名称 * ValueType 特征值类型(只能是十进制、十六进制、浮点数、枚举、字符5种类型) * Min Max 数值类型这里出现范围,枚举类型这里是枚举值,字符类型,这里是空 * 如上面的示例,表示定义了一个针对报文的特征,特征名为 "GenMsgCycleTime",特征值是整型数据,取值范围在 0 到 65535 之间。 ### BA_DEF_DEF_ * 对报文/信号/节点等的属性初始值定义 * 格式如下: ```c BA_DEF_DEF_ AttributeName DefaultValue; ``` * 解释: * BA_DEF_DEF_ 为关键字,表示属性默认值定义 * AttributeName 特征名称 * DefaultValue DefaultValue * 示例: ``` BA_DEF_DEF_ "GenMsgCycleTime" 2200; ``` * 如上面的示例,表示定义了名为 "GenMsgCycleTime" 的特征默认值为 2200。 ### BA_ * 对报文/信号/节点等的属性设置值定义 * 格式如下: ``` BA_ AttributeName projectValue; ``` * 解释: * BA_ 为关键字,表示属性值定义 * AttributeName 特征名称 * projectValue 该特征的设置值 * 示例: ``` BA_ "GenMsgCycleTime" BO_ 400 100; ``` * 如上面的示例,表示 CAN ID 为 400(0x190) 的属性 "GenMsgCycleTime" 的值设置为 100。 ### VAL_ * 数值表定义 * 格式如下: ``` VAL_ MessageId SignalName N "DefineN" ... 0 "Define0"; ``` * 解释: * VAL_ 为关键字,表示数值表定义; * MessageId 表示该信号所属的报文 ID(10进制数表示); * SignalName 表示信号名; * N "DefineN" ... 0 "Define0" 表示定义的数值表内容,即该信号的有效值分别用什么符号表示。 * 示例: ``` VAL_ 996 HUD_OffSt 1 "Active" 0 "Not Active"; ``` * 如上面的示例,表示对 ID 为 996(0x3E4) 的这条报文下的,一个名为 "HUD_OffSt" 的信号,进行其数值表的定义;用 "Active" 取代 1;用 "Not Active" 取代 0。只有自然数类型的信号才可以使用数值表表示。 ### VAL_TABLE_ * VAL_TABLE_ 定义了全局信号数值表,用来对信号值解码。但通常 DBC 中不使用全局信号值表,而是使用单独为某个信号定义的信号值描述('VAL_')。 ### EV_ * EV_ 表示环境变量的定义,一般用不到。