使用dbcc工具根据dbc文件生成CAN报文解析c代码 | 您所在的位置:网站首页 › dbc解析代码 › 使用dbcc工具根据dbc文件生成CAN报文解析c代码 |
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 实验室设备网 版权所有 |