16个稳定版本 (5个主要版本)
6.0.0 | 2024年2月8日 |
---|---|
5.0.0 | 2022年6月22日 |
4.0.0 | 2021年11月15日 |
3.0.2 | 2020年10月28日 |
1.0.0 | 2018年12月9日 |
#126 在 解析器实现
6,676 每月下载量
用于 5 个crates (4 个直接使用)
82KB
2K SLoC
can-dbc
使用Rust的nom解析器组合库编写的CAN-dbc格式解析器。
1. 示例
读取dbc文件并根据dbc中定义的消息/信号生成Rust结构体。
use can_dbc::DBC;
use codegen::Scope;
use std::fs::File;
use std::io;
use std::io::prelude::*;
fn main() -> io::Result<()> {
let mut f = File::open("./examples/sample.dbc")?;
let mut buffer = Vec::new();
f.read_to_end(&mut buffer)?;
let dbc = can_dbc::DBC::from_slice(&buffer).expect("Failed to parse dbc file");
let mut scope = Scope::new();
for message in dbc.messages() {
for signal in message.signals() {
let mut scope = Scope::new();
let message_struct = scope.new_struct(message.message_name());
for signal in message.signals() {
message_struct.field(signal.name().to_lowercase().as_str(), "f64");
}
}
}
println!("{}", scope.to_string());
Ok(())
}
对于根据DBC读取或写入CAN帧的正确实现,我建议您查看dbc-codegen。
2. 示例
文件解析器简单地解析dbc输入文件并打印解析内容。
cargo test && ./target/debug/examples/file_parser -i examples/sample.dbc
安装
can-dbc可在crates.io上找到,并可以像这样包含在您的Cargo启用项目中
[dependencies]
can-dbc = "3.0"
实现的DBC部分
- 版本
- new_symbols
- bit_timing (已弃用但必需)
- nodes
- value_tables
- messages
- message_transmitters
- environment_variables
- environment_variables_data
- signal_types
- comments
- attribute_definitions
- sigtype_attr_list (格式缺少文档)
- attribute_defaults
- attribute_values
- value_descriptions
- category_definitions (已弃用)
- categories (已弃用)
- filter (已弃用)
- signal_type_refs
- signal_groups
- signal_extended_value_type_list
偏离标准
- 在解析器之间使用多空格而不是单空格,例如 (两个空格)
SIG_GROUP 13
。 VAL_
后缀可以是;
或;
替代方案
致谢
测试dbcs文件已从cantools项目复制。
许可证检查
本项目使用cargo-deny检查依赖项的许可证。要本地运行检查,请运行以下命令
cargo install cargo-deny
cargo deny check
依赖项
~2.5MB
~56K SLoC