汽车电子 -- CAN报文接收解析和发送组包

news2024/11/20 21:26:37

之前已经讲过如何生成DBC文件了,程序中该如何解析DBC呢?
其中包括接收CAN报文解析和发送CAN报文组包??

一、Motorola和Intel格式

dbc里的信号Signals,其中里面有两种数据格式 Motorola和Intel格式。

在这里插入图片描述
之前C语言里,讲过无数遍的大小端,排上用场了。
参看:C语言再学习-- 大端小端详解(转)

举个例子,比如数字 0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78

2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12

MSB和LSB:
MSB: MoST Significant Bit ------- 最高有效位
LSB: Least Significant Bit ------- 最低有效位

先看一下,Motorola和Intel格式的区别。

Intel 格式 layout:
在这里插入图片描述
Motorola 格式 layout:
在这里插入图片描述

关于CAN报文,用Motorola,还是Intel格式,只在信号数据跨字节解析时,才有区别。单个字节数据没有区别。

当信号在一个字节内实现(信号不跨字节)时,Intel模式和Motorola模式的信号字节顺序,完全一样:
信号的高位(MSB)放在该字节的高位,信号的低位(LSB)放在该字节的低位。在这里插入图片描述
在这里插入图片描述
如果是信号数据跨字节解析,才有区别。

Motorola格式即大端,信号的高位(MSB)放在低字节的高位,信号的低位(LSB)放在高字节的低位。反映到矩阵图中就是以起始位为原点,自下而上填充。Motorola格式,MSB在LSB上面。
在这里插入图片描述

Intel格式即小端,信号的高位(MSB)放在高字节的高位,信号的低位(LSB)放在低字节的低位;,反映到矩阵图中就是以起始位为原点,自上而下填充。Intel格式,MSB在LSB下面。

在这里插入图片描述
总结就一句话:
Intel格式(小端模式 ): “高位在后,低位在前”;
Motorola格式(大端模式): “高位在前,低位在后”。

解析报文和接收报文都是分为两种方式的,一种是使用位操作、一种是使用位域。

二、CAN接收报文解析

1、Intel格式 CAN接收报文解析

在这里插入图片描述

VehLength = ((((uint32_t)paraData[1] & 0x07) << 8)
		 	 	 | ((uint32_t)paraData[0]));
		 	 	 
VehWidth = ((((uint32_t)paraData[1] & 0xF8) >> 3)
		 	 	 	 | (((uint32_t)paraData[2] & 0x0F) << 5));
		 	 	 	 
VehWheelBase = ((((uint32_t)paraData[2] & 0xF0) >> 4)
		 	 	 	 | (((uint32_t)paraData[3] & 0x7F) << 4));
		 	 	 	 
VehRearOverhang = ((((uint32_t)paraData[3] & 0x80) >> 7)
		 	 	 	 | (((uint32_t)paraData[4]) << 1)
					 | (((uint32_t)paraData[5] & 0x01) << 9));
					 
VehLeftToSRR = ((((uint32_t)paraData[5] & 0xFE) >> 1)
		 	 	 	 | (((uint32_t)paraData[6] & 0x0F) << 7));
		 	 	 	 
VehInstallAngle = ((((uint32_t)paraData[6] & 0xF0) >> 4)
		 	 	 	 | (((uint32_t)paraData[7] & 0x1F) << 4));

2、Motorola格式 CAN接收报文解析

在这里插入图片描述

tmp_VehicleSpdUint = ((((uint16_t)paraData[1])&0x01) << 14) + ((((uint16_t)paraData[2])&0xFF) << 6) + (((uint16_t)paraData[3]) >> 2);

3、最后,乘以factor加上offset

在这里插入图片描述

tmpYawRateF = (((float)tmpYawRateU) * 0.01f) - 81.91f;

三、CAN发送报文组包

1、首先,减去offset除以factor

在这里插入图片描述

tmpYawRateF = (((uint16_t)tmpYawRateU) +81.91) /0.01;

2、Intel格式 CAN发送报文组包

在这里插入图片描述

	messageBuffer[0] |= (uint8_t)(CIPVVehPara.VehLength & 0x00FF);
	messageBuffer[1] |= (uint8_t)((CIPVVehPara.VehLength & 0x0700) >> 8);
	messageBuffer[1] |= (uint8_t)((CIPVVehPara.VehWidth & 0x001F) << 3);
	messageBuffer[2] |= (uint8_t)((CIPVVehPara.VehWidth & 0x01E0) >> 5);
	messageBuffer[2] |= (uint8_t)((CIPVVehPara.VehWheelBase & 0x000F) << 4);
	messageBuffer[3] |= (uint8_t)((CIPVVehPara.VehWheelBase & 0x07F0) >> 4);
	messageBuffer[3] |= (uint8_t)((CIPVVehPara.VehRearOverhang & 0x0001) << 7);
	messageBuffer[4] |= (uint8_t)((CIPVVehPara.VehRearOverhang & 0x01FE) >> 1);
	messageBuffer[5] |= (uint8_t)((CIPVVehPara.VehRearOverhang & 0x0200) >> 9);
	messageBuffer[5] |= (uint8_t)((CIPVVehPara.VehLeftToSRR & 0x007F) << 1);
	messageBuffer[6] |= (uint8_t)((CIPVVehPara.VehLeftToSRR & 0x0780) >> 7);
	messageBuffer[6] |= (uint8_t)(((CIPVVehPara.VehInstallAngle+VEH_INSTALL_ANGLE_OFFSET) & 0x000F) << 4);
	messageBuffer[7] |= (uint8_t)(((CIPVVehPara.VehInstallAngle+VEH_INSTALL_ANGLE_OFFSET) & 0x01F0) >> 4);

3、Motorola格式 CAN发送报文组包

在这里插入图片描述

	messageBuffer[0] |= (uint8_t)((POS_X & 0x7F80) >> 7);
	messageBuffer[1] |= (uint8_t)((POS_X & 0x007F) << 1);
	messageBuffer[1] |= (uint8_t)((POS_Y & 0x4000) >> 14);
	messageBuffer[2] |= (uint8_t)((POS_Y & 0x3FC0) >> 6);
	messageBuffer[3] |= (uint8_t)((POS_Y & 0x003F) << 2);
	messageBuffer[3] |= (uint8_t)((SPD_X & 0x0C00) >> 10);
	messageBuffer[4] |= (uint8_t)((SPD_X & 0x03FC) >> 2);
	messageBuffer[5] |= (uint8_t)((SPD_X & 0x0003) << 6);
	messageBuffer[5] |= (uint8_t)((SPD_Y & 0x3F00) >> 8);
	messageBuffer[6] |= (uint8_t)(SPD_Y & 0x00FF);
	messageBuffer[7] |= (uint8_t)((TargetMovingFlag & 0x01) << 7);
	messageBuffer[7] |= (uint8_t)(gFrameOrder & 0x7F);

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

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

相关文章

win11点击任务栏固定的应用:该文件没有与之关联的应用来执行该操作

点击固定在任务栏的任何图标提示 1、直接点击“开始”旁边的搜索按钮&#xff0c;搜索“注册表编辑器”。 2、找到HKEY_CLASSES_ROOT\lnkfile&#xff08;注意“lnkfile”的l是小写L不是大写i&#xff09;&#xff0c;在右侧新建一个字符串值“IsShortcut”的文件&#xff1…

大模型的背景与现状问题

一、大模型的发展背景 谈起大模型&#xff0c;第一时间想到的是什么&#xff1f;是主流的ChatGPT&#xff1f;或者GPT4&#xff1f;还是DALL-E3&#xff1f;亦或者Midjourney&#xff1f;以及Stablediffusion&#xff1f;还是层出不穷的其他各类AI Agent应用工具&#xff1f;大…

攻防千层饼

近年来&#xff0c;网络安全领域正在经历一场不断升级的攻防对抗&#xff0c;这场攻防已经不再局限于传统的攻击与防御模式&#xff0c;攻击者和防守者都已经越发熟练&#xff0c;对于传统攻防手法了如指掌。 在这个背景下&#xff0c;攻击者必须不断寻求创新的途径&#xff0…

【C++】头文件chrono

2023年10月16日&#xff0c;周一晚上 当前我只是简单的了解了一下chrono 以后可能会深入了解chrono并更新文章 目录 功能原理头文件chrono中的一些类头文件chrono中的数据类型一个简单的示例程序小实验&#xff1a;证明a的效率比a高 功能 这个chrono头文件是用来处理时间的…

git log 美化配置

编辑 vim ~/.gitconfig 添加配置 [alias]lg log --graph --abbrev-commit --decorate --dateformat:%m-%d %H:%M:%S --formatformat:%C(bold blue)%h%C(reset) - %s %C(bold yellow)% d%C(reset) %n %C(dim white) (%ad) - %an%C(reset) --allgit lg 效果

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务&#xff0c;包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组&#xff08;mysql&#xff09;和一个用户&#x…

Cesium Vue(三)— 相机配置

1. 坐标系转换 1.1 cesium使用到的坐标系 屏幕坐标系&#xff0c;二维的笛卡尔坐标系&#xff0c;API > Cartesian2地理空间坐标系&#xff0c;WGS-84坐标系&#xff0c; API > Cartographic(经度&#xff0c;维度&#xff0c;高度)三维笛卡尔空间直角坐标系&#xff0…

华为交换机S200, S1700系列产品命名规则

华为交换机的全系列产品命名规则如下&#xff1a; S系列&#xff1a;代表固定端口交换机。例如&#xff0c;S5720系列、S6720系列。CE系列&#xff1a;代表企业级交换机。例如&#xff0c;CE5800系列、CE6800系列。CloudEngine系列&#xff1a;代表华为云引擎交换机&#xff0c…

如何实现 Es 全文检索、高亮文本略缩处理(封装工具接口极致解耦)

如何实现 Es 全文检索、高亮文本略缩处理 前言技术选型JAVA 常用语法说明全文检索开发高亮开发Es Map 转对象使用核心代码 Trans 接口&#xff08;支持父类属性的复杂映射&#xff09;Trans 接口可优化的点高亮全局配置类如下真实项目落地效果为什么不用 numOfFragments、fragm…

数据结构与算法课后题-第五章(哈夫曼树和哈夫曼编码)

文章目录 选择题1选择题2选择题3选择题4选择题5选择题6选择题7应用题7 选择题1 选择题2 选择题3 需要深究 选择题4 选择题5 选择题6 选择题7 应用题7

【LeetCode刷题(数组and排序)】:存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;nums [1,2…

framework通信机制—LiveData使用方法及原理

LiveData是一种可观察的数据存储器类。与常规的可观察类不同&#xff0c;LiveData 具有生命周期感知能力&#xff0c;意指它遵循其他应用组件&#xff08;如 activity、fragment 或 service&#xff09;的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应…

自我介绍思考

1.引导面试官有重点的看你简历 2.在引导部分暗示他我是最适合这个岗位的 面试官在考察什么&#xff1f; a.你的表述是否一致b.考察你的语言表达能力&#xff0c;逻辑思维能力&#xff0c;总结概括能力c.考察你对现场的把控能力d.对时间的把控能力 怎么做&#xff1f; 1.写逐…

uniapp中全局页面挂载组件(H5)

前言 我们已经学习了 uniapp中全局页面挂载组件&#xff08;小程序&#xff09; 有些小伙伴问在H5怎么做那让我们试一试 直接上代码 //引用组件 import dialog from ./index.vue; //我这里要把小程序的方法和h5方法写一起所以用了混入 import mixins from ./mixins.js //使用…

OJ项目【登录】——验证码、失败登录多次账户冻结、用户密码加密,我是如何实现的?

目录 前言 1、验证码 1.1、引入pom 1.2、前端核心代码 1.3、后端核心代码 2、账户冻结 2.1、思路&#xff1a; 2.2、核心代码示例&#xff1a; 3、密码加密——加盐算法 3.1、思路&#xff1a; 3.2、代码实现示例&#xff1a; 4、小结&#xff1a;展示我的项目 4…

[牛客习题]“幸运的袋子”

习题链接&#xff1a;幸运的袋子_牛客题霸_牛客网 题目分析 由题意可知&#xff1a;“幸运的袋子”的概念是——小球的数值之和大于小球的数值之积。 假如现在有5个小球&#xff1a;1&#xff0c;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;并将他们编号a0~a4.我们…

Vue项目路由加前缀

Vue项目路由加前缀 vue-cli3.0配置 1&#xff09;静态资源前缀 vue.config.js /module.exports 配置 publicPath&#xff1a;“/前缀” 2&#xff09;路由前缀 route/index.js export default new Router({ base:”/前缀" , }) 参考文章&#xff1a;https://blog.csd…

【Java学习之道】网络编程的基本概念

引言 这一章我们将一同进入网络编程的世界。在开始学习网络编程之前&#xff0c;我们需要先了解一些基本概念。那么&#xff0c;我们就从“什么是网络编程”这个问题开始吧。 一、网络编程的基本概念 1.1 什么是网络编程 网络编程&#xff0c;顾名思义&#xff0c;就是利用…

netca_crypto.dll找不到怎么修复?详细解决办法和注意事项

当你在使用计算机时&#xff0c;突然出现了一个错误提示&#xff1a;“netca_crypto.dll 找不到”。不知道该如何解决这个问题&#xff1f;其实要解决是非常的简单的&#xff0c;今天我们将为你提供几种修复 netca_crypto.dll 找不到的解决方法和一些注意事项。在深入探讨修复方…

普通螺纹基本牙型尺寸及拧紧力矩.exe

一、概要 本软件功能主要是通过输入螺纹原始三角形高度P,螺栓规格(公称直径)d,材料的屈服应力σs,计算出公称应力截面积As、外螺纹小径d1、外螺纹小径d2、拧紧力矩T等参数。 开发本软件的原因主要有以下几点: 提高设计效率:通过这款软件,工程师可以快速计算螺纹的基本牙…