使用dbcc工具根据dbc文件生成CAN报文解析c代码 您所在的位置:网站首页 dbc解析代码 使用dbcc工具根据dbc文件生成CAN报文解析c代码

使用dbcc工具根据dbc文件生成CAN报文解析c代码

2024-07-18 06:25| 来源: 网络整理| 查看: 265

dbcc工具在github上的地址: https://github.com/howerj/dbcc 仓库地址: [email protected]:howerj/dbcc.git

源码下载到Ubuntu后,使用gcc编译即可,编译完成后,就可以在源码当前目录生成dbcc可执行程序。 编译方法: make CC=gcc

dbcc工具使用方法: 可以先使用./dbcc -h看下使用帮助说明。

基本的使用方法是,在dbcc参数中跟上dbc文件即可。例如:./dbcc DBC_FILE

示例dbc文件(片段):

BO_ 2F8 DATE_TIME_SZ: 8 Host SG_ DISP_MILLISEC : 0|44@1+ (1,0) [0|3298534883327] "ms" Vector__XXX BO_ 330 LICENSE: 8 Host SG_ LICENSE_NUMBER : 24|16@1+ (1,0) [0|65535] "" Vector__XXX SG_ LICENSE_EXT : 40|16@1+ (1,0) [0|65535] "" Vector__XXX SG_ LICENSE_CITY : 16|8@1+ (1,0) [0|255] "" Vector__XXX SG_ LICENSE_PROV : 0|16@1+ (1,0) [0|65535] "" Vector__XXX BO_ 19A VEH_INFO: 8 Host SG_ VEH_TYPE : 8|8@1+ (1,0) [0|255] "" Vector__XXX SG_ VEH_COMPANY : 0|8@1+ (1,0) [0|255] "" Vector__XX把

dbc文件的格式介绍请阅读博客:DBC文件解析 注意:上面的dbc文件中的can id,我转换成十六进制了,因为生成的代码中,CAN id是以十六进制的形式表示的,所以为了方便查看,我把本来是十进制表示的can id转换成十六进制了。

转换后的代码中,核心的函数是unpack_message,unpack_message函数源码:

int unpack_message(can_obj_ailsz_h_t *o, const unsigned long id, uint64_t data, uint8_t dlc, dbcc_time_stamp_t time_stamp) { assert(o); assert(id unpack_message(&o, can_frame.can_id, *(uint64_t *)can_frame->data, can_frame.can_dlc, 0); } //读取o结构体中的各个字段的值

结构体can_obj_ailsz_h_t中定义了各个CAN报文中的信号字段,如下所示:

typedef PREPACK struct { //........此处省略一部分........... can_0x412_GPS_PO_CAN_SZ_t can_0x412_GPS_PO_CAN_SZ; can_0x414_GPS_PO_EXTS_CAN_SZ_t can_0x414_GPS_PO_EXTS_CAN_SZ; can_0x500_AD_MODE_SZ_t can_0x500_AD_MODE_SZ; } POSTPACK can_obj_ailsz_h_t;

代码中,根据dbc文件中定义的每个can帧的信号,定义出一个一个的结构体,这个总的结构体中包含了dbc文件定义的所有的can帧信息。这部分十分不难,各位读者可自行分析。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有