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

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位于二进制数的最左侧。数据位的最高位。

CAN每个报⽂可包含8Byte的字节数据域,在报⽂内数据的字节序和位序如下:

字节序:Byte0、Byte1、Byte2、Byte3、Byte4、Byte5、Byte6、Byte7

位序:bit7、bit6、bit5、bit4、bit3、bit2、bit1、bit0。

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(十进制) 向有浮点转化 :???待补充

C++编码解析

流程3:

uint64_t jiexi_fun(
  uint16_t startbit, uint8_t length, const uint8_t *rawdata, std::string endian) {
  uint64_t data{0};
  uint8_t lsbbit = startbit % 8;
  uint8_t lsbbyte = startbit / 8;
  if (endian == "Motorola") {
    uint8_t msbbyte = lsbbyte - (lsbbit + length - 1) / 8;
    for (int i{msbbyte}; i < lsbbyte + 1; i++) {
      data+= ((uint64_t)rawdata[i]) << ((lsbbyte - i) * 8);
    }
  } else {
    uint8_t msbbyte = (startbit + length - 1) / 8;
    for (int i{msbbyte}; i >= lsbbyte; i--) {
      data += (((uint64_t)rawdata[i]) << (i - lsbbyte) * 8);
    }
  }
  data= data>> lsbbit;
 
  data <<= (64 - length);
  data >>= (64 - length);
  return data;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT的4个不为人知却非常实用的小功能

重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中&#xff0c;我们发现结果不是自己想要的&#xff0c;可以直接点击“Stop generating”按钮&#xff0c;这样它就会立即停止输出。 二、复制功能 在ChatGPT返回对话的右侧&#xff0c;有三个图…

MySQL主存复制

介绍 配置-主库master 第一步&#xff1a;修改MySQL数据库的配置文件/etc/my.cnf [mysqld] log-binmysql-bin #[必须]启用二进制日志 server-id100 #[必须]服务器唯一id第二部&#xff1a;重启MySQL服务 systemctl restart mysqld第三步&#xff1a;登录MySQL操作&#x…

Linux:软件管理器yum编辑器vim

软件管理器yum&&编辑器vim &#x1f506;软件管理器yum软件包是什么rzsz网络通畅性验证查看软件包怎么安装软件安装yum扩展源怎么卸载软件 &#x1f506;编辑器vim基本概念基本操作正常模式指令集末行模式指令集简单配置vim配置文件的位置常用配置选项使用插件参考资料…

DVWA——Brute Force

文章目录 Brute Force&#xff08;暴力&#xff08;破解&#xff09;&#xff09;&#xff08;1&#xff09;Low等级&#xff08;2&#xff09;Medium等级&#xff08;3&#xff09;High等级&#xff08;4&#xff09;Impossible Brute Force&#xff08;暴力&#xff08;破解&…

chatgpt赋能python:Python如何快速复制上一行?

Python 如何快速复制上一行&#xff1f; 在编写Python代码时&#xff0c;经常需要快速复制上一行代码进行修改。如果只是简单的手动复制粘贴&#xff0c;会造成不必要的时间浪费并且容易出错。本文将介绍三种快速复制上一行代码的方法。 方法一&#xff1a;使用快捷键 在Pyt…

Apache的配置与应用(构建web、日志分割及AWStats分析系统)

Apache的配置与应用 一、构建虚拟Web主机二、httpd服务支持的三种虚拟机类型1、基于域名的虚拟主机2、基于IP地址的虚拟主机3、基于端口的虚拟主机 三、构建web虚拟目录与用户授权限制1、创建用户认证数据文件2、添加用户授权配置3、验证用户访问权限4、在客户机中浏览器访问 四…

Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署

前言 &#x1f680; 需提前安装环境及知识点&#xff1a; 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 &#x1f680; 目的&#xff1a; 将我们的前端项目打包成一个镜像容器并自动发布部署&#xff0c;可供随时pull访问 一、手动部署镜像及容器 1…

校园高校共享单车管理系统nodejs+vue+express

设计的管理员的详细功能见下图&#xff0c;管理员登录进入本人后台之后&#xff0c;管理单车和区域&#xff0c;审核租赁订单和还车订单&#xff0c;收取租赁费用&#xff0c;查看单车租赁统计信息。 vue的文件结构其实就是一个index.html 中间的内容&#xff0c;用的是vue&am…

同步阻塞与异步非阻塞

同步阻塞消息处理 假如有这样一个系统功能&#xff0c;客户端提交Event至服务器&#xff0c;服务器接收到客户请求之后开辟线程处理客户请求&#xff0c;经过比较复杂的业务计算后将结果返回给客户端 以上设计存在几个显著的缺陷&#xff0c;具体如下。同步Event提交&#xf…

Python学习36:文本分析与加密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…

Vue.js 中的路由是什么?如何使用路由?

Vue.js 中的路由是什么&#xff1f;如何使用路由&#xff1f; 在 Vue.js 中&#xff0c;路由是指为不同的 URL 地址提供不同的页面内容或视图的机制。Vue.js 中的路由可以使用 Vue Router 库来实现&#xff0c;它是 Vue.js 官方提供的路由管理库。 Vue Router 简介 Vue Route…

海绵城市智慧监测系统功能、适用范围有哪些?

一、海绵城市在线监测系统拓扑图 海绵城市在线监测系统是通过RTU使用3G/4G信号进行无线传输等方式&#xff0c;将温度、水位、风速、风向、雨量、色度、浊度等数据传输到在线监测平台。经过软件平台的系统性处理后再通过LED显示屏直观、快捷的展现给用户。用户也可以通过电脑、…

如何使用Node.js REPL

目录 1、Nodejs REPL 2、_特殊变量 3、向上箭头键 4、点命令 5、从JavaScript文件运行REPL 1、Nodejs REPL REPL代表Read-Evaluate-Print-Loop&#xff0c;是交互式解释器。 node命令是我们用来运行Node.js脚本的命令&#xff1a; node script.js 如果我们运行node命令…

Unity WebGL打包配置本地服务器

第一步打包 1&#xff09;、先对Player Setting进行设置 2&#xff09;、设置打包的窗口大小 3&#xff09;、遇到异常以及压缩格式 第一个启用异常&#xff0c;指用户指定在运行时意外的代码行为&#xff08;通常被认为错误&#xff09;如何被处理&#xff0c;有三个选项…

3.java高级之GUI编程

1.gui (graphical user interface) awt sun公司最早的gui,不美观,不兼容各平台swing : awt升级2.顶层容器(只有一个)(其他的只能放这里)Jframe Jdialog对话框 Jwindow(x) //在main方法写fnew Jframe(); f.setSize(300,300); //设置大小f.setTitle("hello"); //设置…

【linux】web基础与HTTP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 web基础与HTTP协议 一、DNS/HTML1.域名的概述2.域名注册3.网页的概念4.HTML概述5.网页基本标签 二、web基础1.web概述2.静态网页3.静态网页特点4.动态网页5.动态网页的特点 三…

redis数据持久化

Redis是基于内存的&#xff0c;如果不想办法将数据保存在硬盘上&#xff0c;一旦Redis重启(退出/故障)&#xff0c;内存的数据将会全部丢失。(业务库中缓存的数据 , 存储的一些重要的标签, 状态数据) 我们肯定不想Redis里头的数据由于某些故障全部丢失(导致所有请求都走MySQL)&…

python基础----05-----函数的多返回值、函数的多种参数使用形式、函数作为参数传递、lambda匿名函数

一 函数的多返回值 if __name__ __main__:# 演示使用多个变量&#xff0c;接收多个返回值def test_return ():return 1,hello,Truex,y,z test_return()print(x)print(y)print(z)1helloTrue二 函数的多种参数使用形式 分为以下四种。 2.1 位置参数 位置参数调用函数时根据…

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【计算机网络详解】——应用层(学习笔记)

&#x1f4d6; 前言&#xff1a;应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。在本文中&#xff0c;我们以一些经典的网络应用为例来学习有关网络应用的原理、协议和实现方面的知识。 目录 &a…
最新文章