一个用于解析和转换 CAN 数据库文件(DBC)的 Python 工具。可以将 DBC 文件解码并导出为 JSON、文本或 CSV 格式,方便查看和分析 CAN 总线消息定义。
- 解析标准 DBC 文件格式
- 支持多种导出格式:JSON、TXT、CSV
- 详细的信号信息提取(起始位、长度、字节序、缩放因子等)
- 保留枚举值和注释信息
- 命令行工具和 Python API 两种使用方式
- 可打印 DBC 文件摘要统计信息
- Python 3.7+
- cantools
pip install -r requirements.txt或直接安装:
pip install cantoolspython dbc_decoder.py your_file.dbc这将在当前目录生成三个文件:
your_file_decoded.jsonyour_file_decoded.txtyour_file_decoded.csv
chmod +x dbc_decoder.sh
./dbc_decoder.sh your_file.dbcpython dbc_decoder.py <dbc_file> [选项]
位置参数:
dbc_file DBC 文件路径
可选参数:
-h, --help 显示帮助信息
-o, --out-dir DIR 输出目录(默认:当前目录)
-f, --formats FORMAT 导出格式,可选 json/text/csv(默认:全部)
--indent N JSON 缩进空格数(默认:2)
-v, --verbose 打印 DBC 摘要信息# 仅导出 JSON 格式
python dbc_decoder.py sample.dbc -f json
# 导出到指定目录
python dbc_decoder.py sample.dbc -o ./output
# 导出 JSON 和 CSV,并显示摘要
python dbc_decoder.py sample.dbc -f json csv -v
# 自定义 JSON 缩进
python dbc_decoder.py sample.dbc -f json --indent 4from dbc_decoder import DBCDecoder
# 创建解码器实例
decoder = DBCDecoder("your_file.dbc")
# 打印摘要信息
decoder.print_summary()
# 导出为 JSON 文件
decoder.save_as_json("output.json", indent=2)
# 导出为可读文本文件
decoder.save_as_text("output.txt")
# 导出为 CSV 文件
decoder.save_as_csv("output.csv")
# 获取解码后的字典数据
data = decoder.decode_to_dict()
print(data)详细示例请参考 example_api.py。
包含完整的结构化数据,适合程序解析:
{
"version": "1.0",
"dbc_file": "sample.dbc",
"messages_count": 10,
"messages": [
{
"name": "EngineData",
"id": "0x100",
"id_decimal": 256,
"length": 8,
"sender": "ECU",
"cycle_time": 10,
"comment": "发动机数据",
"signals": [
{
"name": "EngineSpeed",
"start_bit": 0,
"length": 16,
"byte_order": "little_endian",
"is_signed": false,
"scale": 1.0,
"offset": 0.0,
"minimum": 0.0,
"maximum": 8000.0,
"unit": "rpm",
"choices": null,
"comment": "发动机转速",
"receivers": ["Dashboard"]
}
]
}
]
}易于阅读的格式化文本,适合人工查看:
DBC 文件解析结果
文件路径: sample.dbc
================================================================================
[1] 消息名称: EngineData
消息 ID: 0x100 (256)
数据长度: 8 字节
发送节点: ECU
周期时间: 10 ms
注释: 发动机数据
信号列表 (2 个信号):
----------------------------------------------------------------------------
[1] 信号名称: EngineSpeed
起始位: 0, 长度: 16 bits
字节序: little_endian
有符号: 否
缩放因子: 1.0, 偏移量: 0.0
范围: [0.0, 8000.0]
单位: rpm
注释: 发动机转速
接收节点: Dashboard
表格格式,适合在 Excel 或数据分析工具中使用,包含所有消息和信号的详细信息。
| 消息名称 | 消息ID(HEX) | 消息ID(DEC) | 消息长度(字节) | 发送节点 | 周期(ms) | 信号名称 | 起始位 | 长度(bits) | ... |
|---|---|---|---|---|---|---|---|---|---|
| EngineData | 0x100 | 256 | 8 | ECU | 10 | EngineSpeed | 0 | 16 | ... |
dbc_decoder/
├── dbc_decoder.py # 核心解码器实现
├── dbc_decoder.sh # Shell 脚本包装器
├── example_api.py # Python API 使用示例
├── requirements.txt # 项目依赖
└── README.md # 项目文档
- 信号名称和起始位置
- 数据长度和字节序(大端/小端)
- 有符号/无符号
- 缩放因子和偏移量
- 取值范围(最小值/最大值)
- 单位
- 枚举值映射(choices)
- 注释和接收节点
项目实现了 DBCJSONEncoder 类来处理 cantools 库的特殊对象(如 Decimal 类型、NamedSignalValue 等),确保所有数据都能正确序列化为 JSON。
A: 本工具基于 cantools 库,支持标准的 DBC 文件格式。具体支持的版本请参考 cantools 文档。
A: 工具可以处理任意大小的 DBC 文件,但生成的输出文件大小会相应增加。建议根据需要选择合适的导出格式。
A: CSV 文件使用 UTF-8 with BOM 编码,应该在 Excel 中正常显示中文。如果仍有问题,可以尝试用记事本打开后另存为 ANSI 编码。
MIT License
欢迎提交 Issue 和 Pull Request!