车辆CAN信号,依据DBC文件解析流程

news2024/9/28 3:31:41

CAN信号解析流程

1.车辆CAN对应dbc文件

DBC文件是一种用于描述CAN(Controller Area Network)数据通信协议的文件格式,DBC文件中包含了CAN数据的信号定义、编码方式、单位、范围等信息,可以用于解析和生成CAN数据帧。

一个DBC文件通常包含多个数据帧和信号定义,每个数据帧包含了一个或多个信号,每个信号描述了CAN数据的一个或多个位。

dbc文件一个数据包包含内容如下:

 一个信号包含的有效内容:

Name

信号名称

Startbit

信号起始位

Length

信号长度

Byte Order

信号字节序(即大小端)

Value Type

信号数据类型

Factor

信号倍率

Offset

信号偏移量

Minimum

信号最小值

Maximum

信号最大值

2.解析步骤

信号解析公式:

实际值 = (十进制值 * Factor)+ Offset;

十进制值:接收的CAN数据包中,将信号对应的bit位长度取出,所对应的十进制数据值

解析步骤:

  1. 获取信号所需信息

  2. 判断数据是否需进行字节序转换

  3. 获取信号的十进制值

  4. 判断十进制值是否需要向有符号,浮点型转化

  5. 根据公式进行计算信号实际值

补充说明:二进制数据中,通常将最右边的位称为最低位(LSB),最左边的位称为最高位(MSB)。因此,在二进制数据中,bit0通常是指最右边的位,也就是最低位。

LSB的全称是"Least Significant Bit",:意为最低有效位;LSB位于二进制数的最右侧。数据位的最低位。
MSB的全称是"Most Significant Bit",:意为最高有效位。MSB位于二进制数的最左侧。数据位的最高位。

3.解析精度说明

针对dbc信号不同类型信号解析的精度说明。

目前dbc信号数据类型有:

Unsigned

需精度控制,数量占比85%以上

Signed

需精度控制,数量占比10%左右

Double

正常数据类型解析

Float

正常数据类型解析

Unsigned、Signed需精度控制类型说明:

针对这两类的信号数据精度,可采用整形,浮点型。

针对这两类的信号数据精度要求浮点型,则有Float和Double如下考虑:

Float和Double同样是两种浮点数类型。其中Float占用4个字节(32位),Double占用8个字节(64位)。

在精度方面:Double类型的精度要比Float类型高。Double类型可以表示的范围更广,小数点后的位数也更多,因此可以更精确地表示小数。

在使用性能方面:由于Double类型占用的内存空间更大,因此在处理大量浮点数运算时,Double类型的计算速度会比Float类型慢。

推荐高性能计算使用:Float类型

推荐高精度计算使用:Double类型

4.示例

Signed类型解析:

接收数据包的值为:f4 fc 00 00 00 00 00 00 (此数据包为16进制)

1. 获取信号所需信息

{
    "start_bit": 0,
    "bit_length": 16,
    "factor": 0.1,
    "offset": 0,
}

2. 判断数据是否需进行字节序转换

考虑底层(mcu)是否统一发送格式,统一大端或者小端,请于底层进行确认!!

当前内容需进行大小端转换。

f4 fc 00 00 00 00 00 00 == 》》00 00 00 00 00 00 fc f4

3. 获取信号的十进制值

二进制数据中,通常将最右边的位称为最低位(LSB),最左边的位称为最高位(MSB)。因此,在二进制数据中,bit0通常是指最右边的位,也就是最低位。

将获取的数据转化为二进制;

根据:start_bit 以及 bit_length,从信号的 bit 0 位 开始,取出总长度为 16 的数据串,并且转化为十进制数据值。

4. Signed需要向有符号转化

此处需将无符号转化为有符号数据。

当前使用取反加1法进行转化,(此外还有符号位扩展法,补码表示法)

将十进制值 转化为 二进制 并且 进行取反加1法,再转化为十进制

即-780

5. 根据公式进行计算信号实际值

根据计算公式:即可得出 signal = (-780 * 0.1)+ 0.0 = -78.0

所以接收到 signal 数据值为 -78

Unsigned类型解析:

接收数据包的值为:cc 0c 00 00 00 00 00 00 (此数据包为16进制)

1. 获取信号所需信息

{
    "start_bit": 1,
    "bit_length": 15,
    "factor": 0.01,
    "offset": 0,
}

2. 判断数据是否需进行字节序转换

考虑底层(mcu)是否统一发送格式,统一大端或者小端,请于底层进行确认!!

当前内容需进行大小端转换。

cc 0c 00 00 00 00 00 00 ==》》00 00 00 00 00 00 0c cc

3. 获取信号的十进制值

二进制数据中,通常将最右边的位称为最低位(LSB),最左边的位称为最高位(MSB)。因此,在二进制数据中,bit0通常是指最右边的位,也就是最低位。

将获取的数据转化为二进制;

根据:start_bit 以及 bit_length,从信号的 bit 1位开始,取出总长度为 15 的数据串,并且转化为十进制数据值。

4. Unsigned不需要向有符号,浮点型转化,跳过。

5. 根据公式进行计算信号实际值

根据计算公式:即可得出 signal = (1638 * 0.01)+ 0.0 = 16.38

所以接收到 signal 数据值为16.38

Double、Float类型解析

Double、Float类型解析同Signed类型解析流程。

需要注意流程 4向有符号,浮点型转化,这块步骤有所差异,请注意。

类型转化说明

64756(十进制) 向有符号转化 : 二进制取反加1  ==》-780

64756(十进制) 向有浮点转化 :???待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法06:递归和简单的排序

目录 【递归】 【排序】 冒泡排序 插入排序 选择排序 【每日一练:K 个一组翻转链表】 【递归】 递归是将一些有规律的重复问题分解为同类的子问题的方法,也就是在函数中自己调用自己。比较经典的递归代码就是 斐波那契数列,实现方式如…

特征选择及特征提取

特征 什么是特征: 举个例子:一个妹子很好看,好看的在哪里?腿长(特征1),白(特征2),性格开朗(特征3) 那么可以概括为好看妹子的特征是…

修改element Plus的主题样式

安装element plus 安装icon pnpm install element-plus pnpm install element-plus/icons-vue main.ts配置 icon的使用https://element-plus.gitee.io/zh-CN/component/icon.html#%E7%BB%93%E5%90%88-el-icon-%E4%BD%BF%E7%94%A8 import { createApp } from vue import ./sty…

用chatGPT来NEW个对象让“码农”的节日不再仅仅只有1024(赶鸭子上架式的成长、无效不得不立的flag)

用chatGPT来NEW个对象让“码农”的节日不再仅仅只有1024 前言一、大部分的成长都是赶鸭子上架二、节日是为了告诉自己不孤单三、做不到也要立下的flag四、New个对象吧1.php定义一个科技工作者形象2.python定义一个科技工作者形象3.javascript定义一个科技工作者形象 总结 前言 …

Docker的简单使用

文章目录 Docker的简单使用Docker 是什么Docker的基本组成镜像(image)容器(container)仓库(repository) 安装Docker卸载docker配置docker镜像加速Docker的常用命令docker安装nginx(docker简单使…

chatgpt赋能python:Python中升序排序详解

Python中升序排序详解 什么是升序排序? 升序排序指的是按照从小到大的顺序排列数组、列表等数据类型。在Python中,可以使用各种函数和方法来对数据进行升序排序,例如sort()函数、sorted()函数、和lambda表达式等。下面将详细介绍这些方法。…

Leaflet基本用法

使用 阿里云地理工具 获取相应的地理JSON数据,用于对地图边界绘制。 如何使用leaflet? 这里用HTML5进行操作; 因为我是用的是Leaflet库,所以要引入JavaScript 和 CSS 文件(可参考官网https://leafletjs.com/&#x…

chatgpt赋能python:Python中常用的内置函数

Python中常用的内置函数 Python是一门非常强大的编程语言,它有很多内置函数可以帮助开发人员更快速、更便捷地编写程序。在本文中,将会介绍并着重标记加粗一些常用的Python内置函数。 print() print()是Python中最基本也是最常用的内置函数之一&#…

【异常捕获】

异常捕获 异常概念处理错误方式 异常处理举例栈展开异常规范异常继承层次优缺点 异常 概念 异常时程序可能检测到的,运行时不正常的情况,如存储空间耗尽,数组越界等,可以预见可能发生在什么地方但不知道在什么时候发生的错误。 …

chatgpt赋能python:Python中如何更新pip:一篇详细指南

Python中如何更新pip:一篇详细指南 作为一个有10年Python编程经验的工程师,我很清楚更新pip的重要性。pip是Python的依赖管理工具,它可以帮助您轻松安装、升级和删除Python包。随着Python不断发展和更新,保持最新版本的pip也很重…

SCI 投稿论文入门 —— 2. 图片编辑(Visio / Origin)

目录 引言IEEE trans论文图片格式要求单栏图片双栏图片 论文中插入曲线图曲线图具体要求 论文中插入结构图曲线图与结构图结合visio中设置界面单栏单张图片曲线图中需要插入结构图 箭头,线段粗细设置字体下标 引言 由于特殊要求,需要用word版本进行编辑…

Springboot整合Swagger2(3.0.0版本)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

SpringCloudAlibaba下篇(GateWay,Skywalking)(超级无敌认真好用,万字收藏篇!!!!)

文章目录 SpringCloudAlibaba下篇(GateWay,Skywalking)1 GateWay1.1 什么是网关1.2 GateWay介绍1.3 GataWay的基本使用1.4 GataWay整合Nacos1.5 断言路由工厂1.5.1 内置断言路由工厂1.5.2 自定义断言路由工厂 1.6 过滤器工厂1.6.1 内置局部过滤器工厂1.6.2 自定义局部过滤器1.6…

手撕code(2)

文章目录 1 设计模式1.1 单例模式1.1.1 懒汉单例1.1.2 饿汉单例1.1.3 总结 1.2 简单工厂模式 2 实现智能指针 1 设计模式 1.1 单例模式 某个类,不应该有多个实例,此时就可以使用单例模式。如果尝试创建多个实例,编译器就会报错。 1.1.1 懒…

【踩坑】mirai挂机运行经常自动退出怎么办?

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 目录 背景介绍 解决思路 实现方法 最终效果 背景介绍 就是说,后台运行了mcl,但经常莫名其妙自动会退出,导致每次都得手动的去服务器上重新启动mcl。而对于自己运行的需要用…

“老年养生”APP的设计与开发

摘要:我国人口老龄化呈上升趋势,老年人口比重增加。这是我国经济发展的一大挑战,也是老年健康产业的一大机遇。随着我国经济发展,越来越多的人开始关注自己的身体,这导致各种关于健康的网络应用层出不穷。但是经过分析…

正则表达式与通配符 -- *?在正则表达式与通配符中的区别

1、前言 最近因为工作需要写一些自动化脚本,里面需要用到正则表达式来匹配特定的字符串,于是查了一些正则表达式相关的资料。资料里面都提到:*匹配前面的子表达式0次或任意多次。我当时就纳闷,*到底是表示的是匹配的次数还是可以…

2. JVM内存模型深度剖析与优化

JVM性能调优 1. JDK的体系结构2. Java语言的跨平台特性3.JVM整体结构及内存模型3.1 内存模型3.1.1 PC寄存器(线程私有)3.1.2 虚拟机栈(线程私有)1. 局部变量表2. 操作数栈 本文是按照自己的理解进行笔记总结,如有不正确…

SimpleCG绘图函数(3)--绘制矩形

前面我们已经学习了点和线的绘制,本篇我们继续绘图函数学习----矩形的绘制,也就是长方形的绘制,并给出一个绘制楼房的例子演示矩形的应用。 所有绘制矩形相关函数如下: //以下矩形左上角坐标(left, top),右下角坐标(right,bottom ) //以线条…

跨境电商系统开发-电商商城系统平台定制方案

随着业务的拓展,不少企业开始将目光转向国外市场,那么如何定制一套属于想自己的跨境出海电商商城方案呢?需要做好以下关口把关: 欢迎名片交流探讨开发平台流程 买家端(h5/pc/app) www.mardao.cn 账号 密码 卖家端(h5/pc)…