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

仿真CAN报文发送的CRC校验算法(附CAPL代码)

文章目录

  • 前言
  • 一、为什么CAN报文有CRC?
  • 二、怎么确定是否需要做CRC校验?
  • 三、CAPL代码实现CRC算法


前言

关于CRC校验的基本理论、算法实现网上已经有很多介绍文章,本文不再赘述。只是记录在项目测试中真正开发CRC算法并进行测试的一些体会。

一、为什么CAN报文有CRC?

首先从CAN帧结构层面上看,在报文Data后紧跟着的是CRC场,通信收发双方通过约定的算法进行CRC计算来实现数据传输检错功能,以此降低误码率,保证数据传输的正确性和完整性。从应用层面来看车辆的车速档位、Usermode、Carmode等信息需要保证正确传输以达到数据安全。这也是为什么不是所有帧都需要做CRC校验。

二、怎么确定是否需要做CRC校验?

如下图,在DBC或者ARXML中当需要仿真发送的报文中包括checksum和Rollingcounter信号时,就需要进行CRC校验算法开发。这里有几个点需要注意:

  • 仿真发送的报文才需要,接收报文不需要;
  • checksum和Rollingcounter信号名不一定是唯一的,要注意识别。有的可能写CRC、RC等其他形式。当仿真发送报文没有任何作用时,就可以去看看是不是有CRC信号需要算法校验。
  • CRC算法也是多样的,注意根据规范开发。核心数据包括:多项式、初始CRC值、最终异或值。重点是理解CRC算法逻辑,这样不论是在CANoe、TSMaster、Veristand中都可以进行开发。
    在这里插入图片描述

三、CAPL代码实现CRC算法

上面提到,重点是理解CRC算法逻辑然后去有针对性的开发。下面以LIN的CRC为例,使用CAPL进行CRC demo代码的实现。可以根据实际开发需要进行调整。

/*@!Encoding:936*/
includes
{}variables
{byte i;linFrame *msg;int flag;byte index;byte crc_item;byte CRC_CheckSum;byte crcValue = 0x00;byte xorValue = 0x00;byte Frame_Data[7];
}void SimulationCRC(long MsgID,int CycleTime)
{msg.id = 0x00;msg.msgChannel = 1;msg.dlc=8;msg.rtr = 0;  //RTR在output发送帧时使用,为0将重新配置响应数据;为1向总线发送帧头,配合主模式使用msg.byte(1) = i + 0x80;flag = 1;i++;if(i == 0xF){i = 0x0;}//直接定义byte字节值;或者去定义报文信号msg.byte(2) = 0x02;msg.byte(3) = 0x03;msg.byte(4) = 0x04;msg.byte(5) = 0x05;msg.byte(6) = 0xC6;msg.byte(7) = 0x07;Frame_Data[0] = msg.byte(1);Frame_Data[1] = msg.byte(2);Frame_Data[2] = msg.byte(3);Frame_Data[3] = msg.byte(4);Frame_Data[4] = msg.byte(5);Frame_Data[5] = msg.byte(6);Frame_Data[6] = msg.byte(7);if(flag == 1){CRC_CheckSum = crc8Sumu(Frame_Data,7);flag = 0;} msg.byte(0) = CRC_CheckSum;output(msg);flag=1;
}on linFrame *
{if(this.id == 0x00){SimulationCRC(0x00, 50);}
}// ----------------------<crc8Sumu>-------------------------
byte crc8Sumu(byte data[], int Datalen)
{byte CRCInitValue = 0x01;byte CRCPolynomial = 0x02;byte CRCXORValue = 0x03;int i, j;byte Rtn;Rtn = CRCInitValue;for (i = 0; i < Datalen; i++){Rtn ^= data[i];   //异或赋值for (j = 0; j < 8; j++){if (Rtn & 0x80){Rtn = (Rtn << 1) ^ CRCPolynomial; //左移一位后 异或运算}else{Rtn <<= 1;}}}Rtn ^= CRCXORValue;return Rtn;
}

相关文章:

仿真CAN报文发送的CRC校验算法(附CAPL代码)

文章目录 前言一、为什么CAN报文有CRC&#xff1f;二、怎么确定是否需要做CRC校验&#xff1f;三、CAPL代码实现CRC算法 前言 关于CRC校验的基本理论、算法实现网上已经有很多介绍文章&#xff0c;本文不再赘述。只是记录在项目测试中真正开发CRC算法并进行测试的一些体会。 …...

如何在Android应用中最佳实现“Edge to Edge“特性?

Edge to Edge"特性 要在Android应用中最佳实现"Edge to Edge"特性,可以按照以下步骤进行操作: 1. 设置目标版本:将应用的目标版本设置为Android Q或更高版本。在build.gradle文件中,将targetSdkVersion设置为Q。 2. 设置主题样式:在styles.xml文件中,创…...

多租户与低代码开发的应用:解锁企业数字化转型的无限可能

在数字化转型的浪潮中&#xff0c;多租户与低代码开发已经成为推动企业快速、灵活、安全地构建和部署应用的关键技术。本文将深入探讨这两种技术的结合如何为企业带来前所未有的变革和机遇。 多租户架构&#xff1a;资源共享与隔离的艺术 多租户架构&#xff0c;是一种高级的软…...

出现身份验证错误,无法连接到本地安全机构 顺利解决这个问题希望能帮助大家

出现身份验证错误&#xff0c;无法连接到本地安全机构&#xff0c;远程计算机&#xff1a;XX&#xff0c;这可能是由于密码过期&#xff0c;如果密码已过期请更新密码。 我们可以在系统属性中对远程进行设置&#xff0c;以解决远程桌面无法连接到本地安全机构这一问题。 步骤…...

老师把卷子拍成图片如何打印

如今&#xff0c;老师们经常会把试卷、习题拍成图片分享给学生&#xff08;如通过微信群或钉钉群的形式&#xff09;。但随之而来的问题是&#xff0c;这些图片如何方便地打印出来呢&#xff1f;尤其是当面对一张张精美的试卷图片时&#xff0c;许多学生和家长都感到头疼。 一…...

MySQL数据库(三):读取数据库数据

上一节&#xff0c;我们介绍了数据库的基本操作&#xff0c;以及最后演示了如何使用库来连接数据库&#xff0c;在实际应用中&#xff0c;我们通常需要按照指定的条件对数据库进行操作&#xff0c;即增删改查操作&#xff0c;这是非常重要的&#xff01;这一节我们继续通过一个…...

分销裂变实战:PLG模式如何助力企业突破增长瓶颈

在竞争激烈的商业环境中&#xff0c;企业如何快速、有效地实现增长&#xff0c;一直是业界关注的焦点。近年来&#xff0c;分销裂变作为一种新兴的商业模式&#xff0c;凭借其独特的优势&#xff0c;逐渐受到企业的青睐。而产品驱动增长&#xff08;PLG&#xff09;模式更是为分…...

定积分定义求极限专题

文章目录 定积分定义求极限问题的描述解决方法真题实践(持续更新中&#xff0c;未完结&#xff09; 定积分定义求极限问题的描述 在定积分定义求极限中&#xff0c;我们可能存在的问题 被积函数不会找积分区间不会定&#xff08;只会[0,1]的&#xff09;根本不知道“补系数”…...

LLaMA:挑战大模型Scaling Law的性能突破

实际问题 在大模型的研发中,通常会有下面一些需求: 计划训练一个10B的模型,想知道至少需要多大的数据?收集到了1T的数据,想知道能训练一个多大的模型?老板准备1个月后开发布会,给的资源是100张A100,应该用多少数据训多大的模型效果最好?老板对现在10B的模型不满意,想…...

vue3 +elementPlus上传照片墙

获取到照片字符串然后push到fileList对应的URL中 if (formData.value.pictures) {let zz formData.value.pictures.split(",")zz.forEach((item) > {fileList.value.push({ url: item })})}对应表单 <el-form-item label"内容详情图"><el-up…...

Charles网络抓包工具安装和web抓包(一)

目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#…...

mysql workbench使用schema视图导出表和列结构到excel

目的&#xff1a;导出所有表和列的名字和注释 很多时候没有正规的数据库文档&#xff0c;为了快速交流啊&#xff0c;需要一个快捷的基础。数据库建表的时候可能有注释&#xff0c;也可能没有注释。有当然好&#xff0c;查看注释就能清楚很多&#xff0c;没有的话最好一个一个补…...

Linux操作系统--软件包管理(保姆级教程)

RPM软件包的管理 大多数linux的发行版本都是某种打包系统。软件包可以用来发布应用软件&#xff0c;有时还可以发布配置文件。他们比传统结构的.tar和.gz存档文件有几个优势。如它们能让安装过程尽可能成为不可分割的原子操作。 软件包的安装程序会备份它们改动过的文件。如果…...

【uniapp】HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE

HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE 问题描述 uniapp开发微信小程序&#xff0c;在HBuilderx中运行到微信开发者工具时报错Error: Fail to open IDE 解决方案 1. 查看微信开发者工具端服务端口是否开放 打开微信开发者工具选择&#xff1…...

Rust详解日志

详解日志 相比起监控&#xff0c;日志好理解的多&#xff1a;在某个时间点向指定的地方输出一条信息&#xff0c;里面记录着重要性、时间、地点和发生的事件&#xff0c;这就是日志。 注意&#xff0c;本文和 Rust 无关&#xff0c;我们争取从一个中立的角度去介绍何为日志 日…...

某麦网自动刷新抢票脚本——手机端(高级版)

某麦网自动刷新抢票脚本——电脑端 小白操作-抵制黄牛–需要更好用更高级关注获取 如何用Python自动抢大麦网演出票&#xff1f; 在数字化时代&#xff0c;购票已经成为我们生活的一部分&#xff0c;无论是音乐会、话剧、体育赛事还是各种展览&#xff0c;抢票几乎成了一项“…...

【MySQL】(基础篇十八) —— 触发器

触发器 本文学习什么是触发器&#xff0c;为什么要使用触发器以及如何使用触发器&#xff0c;还介绍创建和使用触发器的语法。 MySQL语句在需要时被执行&#xff0c;存储过程也是如此。但是&#xff0c;如果你想要某条语句&#xff08;或某些语句&#xff09;在事件发生自动执…...

[19] Opencv_CUDA应用之 基于形状的对象检测与跟踪

Opencv_CUDA应用之 基于形状的对象检测与跟踪 形状可以用作全局特征检测具有不同形状的物体,可以是直线、多边形、圆形或者任何其他不规则形状利用对象边界、边缘和轮廓可以检测具有特定形状的对象本文将使用Canny边缘检测算法和Hough变换来检测两个规则形状,即线和圆1. Cann…...

【Echarts】散点图 制作 气泡 类型图表

目录 需求主要代码效果展示注 需求 需参照设计图画出对应图表 主要代码 /**** 数据 ****/ this.dataList [...Array(8).keys()].map((item) > {return {ywlxmc: 业务类型 (item 1),sl: item > 4 ? 50 : 70} })/**** 气泡样式 ****/ const styleList [{offset: [56…...

深入理解Spring Boot的启动过程

深入理解Spring Boot的启动过程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一起深入探讨Spring Boot的启动过程。Spring Boot作为一…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...