偏过程向,抽时间完成
预计使用python进行编写,首先分析dbc。
1.使用notepad++打开dbc
发现以下几点:
1)BO_到第一个”:“为报文名
2)SG_ 到”:“之间为信号名
3)”:“到第一个”|“之间为信号起始位
4)第一个”|“到”@0+“之间为信号长度
我们的结构体是
typedef struct XXX
{
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
BITFIELD XXX: 8;
} XXX;
几个要素全都聚齐了,同时起始位置和长度还可以帮我们判断是否存在NotUsed
用python先提取他们出来:
import re
# 假设这是你提供的数据字符串
data = """ 字符串"""
# 正则表达式模式
msg_pattern = re.compile(r'BO_\s+(\d+)\s+(\w+):')
signal_pattern = re.compile(r'SG_\s+(\w+)\s+:\s+(\d+)\|(\d+)@')
# 提取报文名
messages = msg_pattern.findall(data)
for msg_id, msg_name in messages:
print(f"报文名: {msg_name}, ID: {msg_id}")
# 提取信号信息
signals = signal_pattern.findall(data)
for signal_name, start_bit, length in signals:
print(f"信号名: {signal_name}, 起始位: {start_bit}, 长度: {length}")
难点来了,在Motorola的大端格式中,报文中信号的排列顺序是从小到大的,但是信号内又是从大到小占位的,这给我们判断是否存在NotUsed带来了麻烦,同时如果有报文横跨3byte,更是难上加难。
目前有两种想法:
1、采用小端算法进行转换,完成后再用小端转大端
2、使用数组来进行数据存储,同时计数,使用起始位对8取余来判断在哪个位置,需要向右加几,是否需要转向下一行,进行三个或三个以上完整的byte后,在从右向左进行结构体写入,同时还要判断由于换byte出现的其他信号插队
未完待续……