CAN FD 64位DBC转结构体


偏过程向,抽时间完成


        预计使用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出现的其他信号插队


未完待续……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值