当前位置: 首页 > news >正文

由dbc文件解析can消息(一)

首要任务就是书写dbc,如何根据协议内容来书写dbc文件也是必须的技能,所以我们先从书写dbc文件开始,然后再根据dbc文件来解析/发送can消息。dbc文件作为协议的表达形式,是can通信的基础文件。这个虽然之前也写过一次了,这里我们主要是重新回顾一下。
https://blog.csdn.net/hooksten/article/details/131799761?spm=1011.2415.3001.5331

目录

  • dbc文件说明
  • 软件安装
  • 新建dbc文件并定义node
  • 新建signal
  • 新建message
  • 添加节点关系

dbc文件说明

我们先来看一个已经写好的dbc文件.我在想dbc文件是否是一个文本文件呢?对于一个写好的dbc文件来说,确实可以当成是一个文本文件来使用的。

VERSION ""NS_ : NS_DESC_CM_BA_DEF_BA_VAL_CAT_DEF_CAT_FILTERBA_DEF_DEF_EV_DATA_ENVVAR_DATA_SGTYPE_SGTYPE_VAL_BA_DEF_SGTYPE_BA_SGTYPE_SIG_TYPE_REF_VAL_TABLE_SIG_GROUP_SIG_VALTYPE_SIGTYPE_VALTYPE_BO_TX_BU_BA_DEF_REL_BA_REL_BA_DEF_DEF_REL_BU_SG_REL_BU_EV_REL_BU_BO_REL_SG_MUL_VAL_BS_:BU_: AD VCU
VAL_TABLE_ Status_Yawrate_Z1 2 "Signal failure" 1 "Sensor not available" 0 "Signal in specification" ;
VAL_TABLE_ Parallel_torque_or_speed_or_Acc 2 "Acc_Control" 1 "Speed_Control" 0 "Torque_Control" ;
VAL_TABLE_ Mode_Control 1 "Value" 0 "Invalue" ;
VAL_TABLE_ VCU_EPS_Direction 1 "Right" 0 "Left" ;
VAL_TABLE_ EPS_Direction 255 "Right" 0 "Left" ;
VAL_TABLE_ iECU_Power_Control 1 "Speed_Control" 0 "Torque_Control" ;
VAL_TABLE_ iECU_Flag 1 "Valid" 0 "Invalid" ;
VAL_TABLE_ iECU_Left_Turn_Light 1 "Turn On" 0 "Turn Off" ;
VAL_TABLE_ iECU_HeadLight 1 "Turn On" 0 "Turn Off" ;
VAL_TABLE_ iECU_Right_Turn_Light 1 "Turn On" 0 "Turn Off" ;
VAL_TABLE_ iECU_Gear 3 "R" 2 "N" 1 "D" 0 "P" ;
VAL_TABLE_ MCU_Motor_Error_Grade_Table 3 "Break Down" 2 "Serious Fault" 1 "Slight Fault" 0 "Normal" ;
VAL_TABLE_ Energy_Recovery_State_Table 1 "����������" 0 "����������" ;
VAL_TABLE_ Shift_Table 3 "Reserved" 2 "����" 1 "ǰ��" 0 "�յ�" ;
VAL_TABLE_ DriveMode_Table 3 "VCU�ٶȿ���" 2 "VCUŤ�ؿ���" 1 "Emergency Stop ��ͣ��0ת��" 0 "��ֹ���У�0Ť��" ;
VAL_TABLE_ VCU_Motor_Request_Valid_Table_ 1 "Valid" 0 "Invalid" ;
VAL_TABLE_ for_release 3 "ERROR" 2 "Press Down" 1 "Pull Up" 0 "Release" ;
VAL_TABLE_ to_no_fault 1 "Fault" 0 "No Fault" ;
VAL_TABLE_ for_unknow 3 "Reserved" 2 "Released" 1 "Parked" 0 "Unknow" ;
VAL_TABLE_ to_valid 1 "Invalid" 0 "Valid " ;
VAL_TABLE_ for_no_request 3 "Reserved" 2 "LockBrakeRquest" 1 "ReleaseBrakeRequest" 0 "NoRequest" ;BO_ 1287 AD_Setup_Control: 8 ADSG_ CAN_Sign_tran_State : 16|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Release_R_Bumper : 4|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Release_L_Bumper : 3|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Disable_R_Bumper : 12|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Disable_L_Bumper : 11|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Disable_B_Bumper : 10|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Disable_F_Bumper : 9|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Clear_TRIP : 8|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Release_B_Bumper : 2|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Release_F_Bumper : 1|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Release_Emergency_Button : 0|1@1+ (1,0) [0|1] ""  VCUBO_ 1291 AD_Pwr_Control: 8 ADSG_ Reserved_Sys_Power_Control : 2|2@1+ (1,0) [0|3] ""  VCUSG_ Vehicle_Work_Mode_Control : 32|2@1+ (1,0) [0|3] ""  VCUSG_ Radar_Sys_Power_Control : 6|2@1+ (1,0) [0|3] ""  VCUSG_ Business_Sys_Power_Control : 8|2@1+ (1,0) [0|3] ""  VCUSG_ Network_Sys_Power_Control : 4|2@1+ (1,0) [0|3] ""  VCUSG_ AD_Sys_Power_Control : 0|2@1+ (1,0) [0|3] ""  VCUBO_ 1290 AD_VCU_Pwr_Control: 8 ADSG_ AD_Vehicle_PwrReq : 0|8@1+ (1,0) [0|255] ""  VCUBO_ 1286 AD_Control_Body: 8 ADSG_ AD_Horn_2_Control : 24|1@1+ (1,0) [0|1] "" Vector__XXXSG_ AD_ADS_Light : 17|2@1+ (1,0) [0|3] "" Vector__XXXSG_ AD_Fof_Light : 16|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Body_Valid : 0|4@1+ (1,0) [0|15] "N/A"  VCUSG_ AD_Low_Beam : 11|1@1+ (1,0) [0|1] "N/A"  VCUSG_ AD_Reversing_Lights : 10|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Double_Flash_Light : 9|1@1+ (1,0) [0|1] ""  VCUSG_ AD_Brake_Light : 8|1@1+ (1,0) [0|1] "N/A"  VCUSG_ AD_Horn_1_Control : 14|1@1+ (1,0) [0|1] "N/A"  VCUSG_ AD_High_Beam : 15|1@1+ (1,0) [0|1] "N/A"  VCUSG_ AD_Right_Turn_Light : 13|1@1+ (1,0) [0|1] "N/A"  VCUSG_ AD_Left_Turn_Light : 12|1@1+ (1,0) [0|1] "N/A"  VCUBO_ 1284 AD_Control_Accelerate: 8 ADSG_ AD_Energy_Recovery : 4|4@1+ (1,0) [0|1] "N/A" Vector__XXXSG_ AD_Decelerate_Pedal : 32|8@1+ (1,0) [0|100] "%" Vector__XXXSG_ AD_Accelerate_Pedal : 8|8@1+ (1,0) [0|100] "%" Vector__XXXSG_ AD_Speed_Req : 48|16@1+ (0.1,0) [0|80] "km/h"  VCUSG_ AD_Torque_Pedal : 40|8@1+ (1,0) [0|100] "%"  VCUSG_ AD_Accelerate_Gear : 24|8@1+ (1,0) [0|3] "N/A"  VCUSG_ AD_Accelerate_Work_Mode : 16|8@1+ (1,0) [0|2] "N/A"  VCUSG_ AD_Accelerate_Valid : 0|4@1+ (1,0) [0|15] "N/A"  VCUBO_ 1283 AD_Control_Brake: 8 ADSG_ AD_BrakePressure_Req : 8|8@1+ (1,0) [0|100] "%"  VCUSG_ AD_DBS_Valid : 0|4@1+ (1,0) [0|15] "N/A"  VCUBO_ 1282 AD_Control_Steering: 8 ADSG_ AD_Steering_Speed_Cmd : 8|8@1+ (0.1,3.5) [3.5|29] ""  VCUSG_ AD_Steering_Angle_Cmd : 32|16@1+ (0.1,-35) [-35|35] "deg"  VCUSG_ AD_Steering_Valid : 0|4@1+ (1,0) [0|15] "N/A"  VCUCM_ BO_ 1287 "�����ͣ��Bumper�����С�����";
CM_ SG_ 1287 CAN_Sign_tran_State "ת���źſ�����־
0��ת��
1����ת��";
CM_ SG_ 1287 AD_Release_R_Bumper "0����1�����Bumper
";
CM_ SG_ 1287 AD_Release_L_Bumper "0����1�����Bumper
";
CM_ SG_ 1287 AD_Disable_R_Bumper "0 ���������Bumper
1 ������Bumper";
CM_ SG_ 1287 AD_Disable_L_Bumper "0 ���������Bumper
1 ������Bumper";
CM_ SG_ 1287 AD_Disable_B_Bumper "0 ������ú�Bumper
1 ���ú�Bumper";
CM_ SG_ 1287 AD_Disable_F_Bumper "0 �������ǰBumper
1 ����ǰBumper";
CM_ SG_ 1287 AD_Clear_TRIP "0����1������
";
CM_ SG_ 1287 AD_Release_B_Bumper "0����1�����Bumper
";
CM_ SG_ 1287 AD_Release_F_Bumper "0��Ч��1���ǰBumper
";
CM_ SG_ 1287 AD_Release_Emergency_Button "0��Ч��1�����ͣ��ť
";
CM_ BO_ 1291 "�Զ���ʻϵͳ����ä�״�ϵͳ��ҵ��ϵͳ�����ϵͳ��4G����ϵͳ���µ����
";
CM_ SG_ 1291 Reserved_Sys_Power_Control "Ԥ��ϵͳ���µ����  Ĭ���ϵ�
0�µ磬1�ϵ磬2����
ZL00042��ZL00043���͸ýӿ�������Monitorϵͳ�����µ���ƽӿڣ����Ϊ�������ܼ���ǰ��̨���ͣ����ֶ���ҪĬ�Ϸ�1������ǰ��̨���͵�Monitor���ܳ��ڱ����ϵ�";
CM_ SG_ 1291 Vehicle_Work_Mode_Control "Ĭ�ϲ���Ϊ��������ģʽ
0Ϊ��������ģʽ
1Ϊ��ʱͣ��
2Ϊ��ʱ��ͣ��";
CM_ SG_ 1291 Radar_Sys_Power_Control "��ä�״�ϵͳ���µ���� Ĭ���ϵ�
0�µ磬1�ϵ磬2���֣�3����";
CM_ SG_ 1291 Business_Sys_Power_Control "ҵ��ϵͳ���µ���� Ĭ���ϵ�
0�µ磬1�ϵ磬2���֣�3����";
CM_ SG_ 1291 Network_Sys_Power_Control "4G����ϵͳ���µ����  Ĭ���ϵ�
0�µ磬1�ϵ磬2���֣�3����";
CM_ SG_ 1291 AD_Sys_Power_Control "�Զ���ʻϵͳ���µ���� Ĭ���ϵ�
0�µ磬1�ϵ磬2����";
CM_ BO_ 1290 "Զ���ϵ��ź�";
CM_ SG_ 1290 AD_Vehicle_PwrReq "���̵�Դ����
0�ػ������̡�����ϵͳ���ϵ磩
1���������̡�����ϵͳ���ϵ磩
2���ֵ��̵�ǰ״̬
3���������̹ػ�2s���ٿ�����ֻ���ڵ����ϵ������·������Ż���Ч��
4�����µ磨ֻ��Ӧ5����ʱ���յ���ָ��״̬�������µ磬ֱ�ӷ���ָ���Ӧ��
";
CM_ BO_ 1286 "ADģʽ��body����
��AD�ڵ㷢�ͣ���VCU�ڵ����";
CM_ SG_ 1286 AD_Horn_2_Control "0x00:���ش����ȹ�
0x01:���ش����ȿ�";
CM_ SG_ 1286 AD_ADS_Light "0��ADS�ƹ�
1��ADS�Ƶ���
2��ADS�Ƹ���";
CM_ SG_ 1286 AD_Fof_Light "����
0��ʾδ����
1��ʾ����";
CM_ SG_ 1286 AD_Body_Valid "0��ʾ��Ч��1��ʾ���������ɿ�";
CM_ SG_ 1286 AD_Low_Beam "0��ʾС�ƹر�
1��ʾС�ƿ���";
CM_ SG_ 1286 AD_Reversing_Lights "�����ƿ��ƣ�ADģʽ�����κι�����ֻ�ɸýӿڿ��ƣ�
0��
1��";
CM_ SG_ 1286 AD_Double_Flash_Light "˫������
0��
1��";
CM_ SG_ 1286 AD_Brake_Light "ADģʽ�£��ƶ���ֻ�ɸ��źſ��ƣ����˰��¼�ͣ����ң�������ƶ��������κ���������
0�ƶ��ƹ�
1�ƶ��ƿ�
";
CM_ SG_ 1286 AD_Horn_1_Control "0x00:���ٱ�������
0x01:���ٱ�������";
CM_ SG_ 1286 AD_High_Beam "0��ʾ��ƹر�
1��ʾ��ƿ���";
CM_ SG_ 1286 AD_Right_Turn_Light "0��ʾ��ת�ƹر�
1��ʾ��ת�ƿ���";
CM_ SG_ 1286 AD_Left_Turn_Light "0��ʾ��ת�ƹر�
1��ʾ��ת�ƿ���";
CM_ BO_ 1284 "AD��������
��AD�ڵ㷢�ͣ���VCU�ڵ����";
CM_ SG_ 1284 AD_Energy_Recovery "�Զ���ʻ�·����������ձ�־λ";
CM_ SG_ 1284 AD_Decelerate_Pedal "��Ӧ���ٶȼ�����";
CM_ SG_ 1284 AD_Accelerate_Pedal "��Ӧ���ٶȼ�����";
CM_ SG_ 1284 AD_Speed_Req "���������٣�km/h��";
CM_ SG_ 1284 AD_Torque_Pedal "�������ſ���0~100%����ӦŤ��0~90N.m";
CM_ SG_ 1284 AD_Accelerate_Gear "0:Pפ����  1��Dǰ����  2��N�յ�  3��R���˵�
";
CM_ SG_ 1284 AD_Accelerate_Work_Mode "0��ʾ������Ť�ؿ��ƣ�1��ʾ�������ٶȿ��ƣ�2��ʾ�����ɼ��ٶȿ���";
CM_ SG_ 1284 AD_Accelerate_Valid "0��ʾ��Ч��1��ʾ�����Զ���ʻ";
CM_ BO_ 1283 "AD�ƶ�����
��AD�ڵ㷢�ͣ���VCU�ڵ����";
CM_ SG_ 1283 AD_BrakePressure_Req "�ƶ�̤�壨0~100%������Ӧ0-10Mpaѹ������";
CM_ SG_ 1283 AD_DBS_Valid "0��ʾ��Ч��1��ʾ�ƶ��ɿ�";
CM_ BO_ 1282 "ADת������
��AD�ڵ㷢�ͣ���VCU�ڵ����";
CM_ SG_ 1282 AD_Steering_Speed_Cmd "�ֶ�ת����ٶȿ���";
CM_ SG_ 1282 AD_Steering_Angle_Cmd "ADģʽ�£�-35��+35�� ת�����������Ҹ���";
CM_ SG_ 1282 AD_Steering_Valid "0��ʾ��Ч��1��ʾת��ɿ�";
BA_DEF_ SG_  "GenSigSendType" ENUM  "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
BA_DEF_ SG_  "GenSigInactiveValue" INT 0 0;
BA_DEF_ BO_  "GenMsgCycleTime" INT 0 0;
BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","not_used","not_used","not_used","not_used","Cyclic","not_used","IfActive","NoMsgSendType";
BA_DEF_ BU_  "NmStationAddress" HEX 0 0;
BA_DEF_  "DBName" STRING ;
BA_DEF_  "BusType" STRING ;
BA_DEF_DEF_  "GenSigSendType" "Cyclic";
BA_DEF_DEF_  "GenSigInactiveValue" 0;
BA_DEF_DEF_  "GenMsgCycleTime" 0;
BA_DEF_DEF_  "GenMsgSendType" "NoMsgSendType";
BA_DEF_DEF_  "NmStationAddress" 0;
BA_DEF_DEF_  "DBName" "";
BA_DEF_DEF_  "BusType" "CAN";
BA_ "DBName" "G14_CAN2_AD";
BA_ "GenMsgSendType" BO_ 1287 0;
BA_ "GenMsgCycleTime" BO_ 1287 20;
BA_ "GenMsgSendType" BO_ 1291 0;
BA_ "GenMsgCycleTime" BO_ 1291 20;
BA_ "GenMsgSendType" BO_ 1290 7;
BA_ "GenMsgCycleTime" BO_ 1290 20;
BA_ "GenMsgSendType" BO_ 1286 0;
BA_ "GenMsgCycleTime" BO_ 1286 20;
BA_ "GenMsgSendType" BO_ 1284 0;
BA_ "GenMsgCycleTime" BO_ 1284 20;
BA_ "GenMsgSendType" BO_ 1283 0;
BA_ "GenMsgCycleTime" BO_ 1283 20;
BA_ "GenMsgSendType" BO_ 1282 0;
BA_ "GenMsgCycleTime" BO_ 1282 20;

但是很明显,是有很多的乱码的,按照我的经验,这里的乱码主要是因为中文说明导致的。我们通过软件打开这个dbc文件后,将所有的中文说明都去除,然后重新进行保存过后就得到了:

然后我们来讲解一下具体应该怎么按照协议来写dbc文件。

软件安装

安装专门用于书写dbc文件的windows下的软件。
https://www.vector.com/gb/en/download/candb-31-sp5/
Vector CANdb++ Editor下载即可
默认进行安装,选择需要的路径,安装完成之后打开就会进入对应的编译界面
在这里插入图片描述

新建dbc文件并定义node

新建一个dbc文件,会让你选择对应的类型,我们这里直接选择CANoe的模板
在这里插入图片描述
选择第一个,设置对应的文件夹和名称。

新建signal

有了dbc文件之后,需要根据协议创建信号,我们右键新建一个信号,然后根据协议编辑signal的各种选项。
在这里插入图片描述
对于这个协议来说,有两个node,分别是mcu和vcu,这个消息是vcu发给mcu的,报文id比较长,是扩展帧形式,第一个信号是转速值,我们新建的signal如下:
在这里插入图片描述
2B是16bit,然后是intel类型,有符号数,foctor是0.5(图中设置有误),offset是-10000,此时可以直接点击calculate minimum和maximum来计算出它的范围,但是与协议的范围不一致,我们再把范围也同步修改即可。同时也会有单位Unit,填上rpm即可。
里面的含义具体解释如下:
在这里插入图片描述
主要是最后一项比较有用,我们可以直接通过分辨率和偏移值计算出实际的物理信号对应的值是多少。

新建message

定义完所有的signal之后就可以把它们组装到一个message中了,也是右键选择新建message,然后设置对应的信号
在这里插入图片描述
DLC是can_id对应的信号的长度,我们的协议0-7B,所以是占满了8个Byte的,那么DLC就是8,同时它是扩展帧,填上对应id值。
然后切换到signals选项,选择add来添加信号:
在这里插入图片描述
除了这样手动的添加外,还可以通过layout将信号对应的关系拖动对应的位置,这样比较不容易出错:
在这里插入图片描述

添加节点关系

最后我们再来添加节点,添加两个节点vcu和mcu,根据message和signal填入指定的位置:
在这里插入图片描述
这里的信号vcu到mcu,所以mcu是R(receive),vcu是发送T。节点关系添加完成后才算是完成了整个dbc的编写(有点想网络通信,需要指定哪两个,通过什么端口进行通信,这个在解析的时候不重要,但是对于程序刷写来说还是很重要的)

http://www.lqws.cn/news/569881.html

相关文章:

  • 信创背景下应用软件迁移解析:从政策解读到落地实践方案
  • 使用Xshell学习Linux的一些基本操作
  • JavaScript基础-常见网页特效案例
  • NumPy 统计函数与矩阵运算指南
  • 【大语言模型入门】—— 浅析LLM基座—Transformer原理
  • FPGA实现CameraLink视频解码,基于Xilinx ISERDES2原语,提供4套工程源码和技术支持
  • 【系统分析师】2021年真题:案例分析-答案及详解
  • SpringCloud系列(41)--SpringCloud Config分布式配置中心简介
  • 《从Backprop到Diffusion:深度学习的算法进化树全景图》
  • C++洛谷P1001 A+B Problem
  • 7类茶叶嫩芽图像分类数据集
  • 低延时高速数据链技术在无人平台(无人机无人船无人车)中的关键作用与应用
  • 2025年前端最新面试题及答案
  • S7-1200 CPU 与 S7-200 SMART S7通信(S7-1200 作为服务器)
  • 【算法设计与分析】(三)二分搜索技术与大整数乘法
  • Spring Cloud:分布式事务管理与数据一致性解决方案
  • stm32之普通定时器
  • C++并发编程-5.C++ 线程安全的单例模式演变
  • 从代码学习深度学习 - 自然语言推断:使用注意力 PyTorch版
  • burp suit使用
  • 自动化提示工程:未来AI优化的关键突破
  • mysql数据库完整备份导出
  • 板凳-------Mysql cookbook学习 (十--15)
  • Java面试宝典:基础四
  • 消息队列:Redis Stream到RabbitMQ的转换
  • allegro 铜皮的直角边怎么快速变成多边形?
  • Python 数据分析与可视化 Day 11 - 特征工程基础
  • MyBatis的添加(insert)操作
  • vue-30(理解 Nuxt.js 目录结构)
  • Ubuntu基础(上传文件和部署Python)