checksum的算法和代码实现

这篇具有很好参考价值的文章主要介绍了checksum的算法和代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01--checksum的作用

现在在一辆汽车上,有很多控制器,很多控制器之间的通讯需要通过CAN网络,通讯过程中数据的传输尤为重要,因为数据的交互之后往往伴随着相关的硬件会执行指令的请求。在这个过程中,数据的检验是非常有必要的,checksum就是用来校验数据的一致性,主要是输入和输出的数据。

02--checksum算法

checksum算法多种多样,可以根据客户的提供的算法当然也可以自己按照软件的需求进行开发,这里我们说下比较简单的一种算法,checksum累加和的计算。

发送方:

1.计算checksum的数据按1byte划分开来,每1byte组成一个8bit的值(即抓取一段报文)

2.将所有的1字节8位的值进行累加得到一个新值

3.若新的值溢出了,即大于0xff时,将新值得高8位与低8位进行相加

4.将最终的8位的值进行按位求反,及得到了checksum的值

接收方:

可以将发送端的数据与checksum的值进行相加,理论上相加后的值按位都为1,此时将该值再加1,得到的结果为0(实际得到的应该是0b100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).那么说明数据没有出现传输错误

03--举例说明

假设有一段发送报文为:03 33 32 00 0E 00 04 00

累加:0x03+0x33+0x32+0x0E+0x04 = 0x7B

取反:为0x84

接收方:0x03+0x33+0x32+0x0E+0x04 +0x84 = 0xff

(uint8)0xff +0x01 = 0

04--C代码实现

发送:

 uint8_t Send_CheckSum(uint8_t *data, uint8_t len) //data为数组,len为数组长度

    uint8_t i, crc = 0;
 
    for(i=0; i<len; i++)
    {
        crc += *(data++);
    }
     crc = ~crc;
    return crc;
}

接收:

uint8_t receive_CheckSum(uint8_t *data, uint8_t len) //data为数组,len为数组长度

    uint8_t i, crc = 0;
 
    for(i=0; i<len; i++)
    {
        crc += *(data++);
    }
     crc = crc;
    return crc+1;
}

05--另外一种checksum算法

也是将checksum的数据按1byte划分开来,每1byte组成一个8bit的值

算法:按报文信息的地址(按1字节划分)再加上报文的前7字节的和,高位溢出取低8位。

举例说明:若某报文的地址为0x284,某信号报文内容为:00 00 FF FF 00 00 9A 1E

累加:0x02+0x84+0xFF+0xFF+0x9A = 0x31E 高位溢出了3,舍掉取低8位

crc = 1E

can报文的checksum计算,汽车行业工具使用,mcu

 代码实现:

can_crc.c

#include "can_crc.h"

uint8 CRC8_SAE_CksIdx(const uint8 *xData,uint8 xDataLen,uint8 id1,uint8 id2)
{
   uint8 crc = (CRC_INIT1 + id1 + id2);
   uint8 u8ByteIdx;
   
for ( u8ByteIdx=0 ; u8ByteIdx<=(xDataLen-1); u8ByteIdx++ )
      {        
         crc += xData[u8ByteIdx];
         
      }
    
   return crc&UINT8_MAX;
}

can_crc.h文章来源地址https://www.toymoban.com/news/detail-621331.html

#include "std_type.h"
#define UINT8_MAX 0xFF
#define CRC_POLY  0x1D  // Polynom = 0x1D
#define CRC_INIT  0xFF  // init value = 0xFF
#define CRC_INIT1   0x00 // init value = 0x00
#define CKS_LASTB 7// CheckSum at last byte in the message

extern uint8 CRC8_SAE_CksIdx(const uint8 *xData,uint8 xDataLen,uint8 id1,uint8 id2);

到了这里,关于checksum的算法和代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CAN报文解析

    CAN报文是指发送单元向接受单元传送数据的帧。我们通常所说的CAN报文是指在CAN线(内部CAN、整车CAN、充电CAN)上利用ECU和CAN卡接收到的十六进制报文。 对于单个Byte,CAN总线在进行数据传输时,首先传输一个字节的高位(MSB),最后传输该字节的低位(LSB)。 一般情况下,

    2023年04月08日
    浏览(26)
  • 基于Python的汽车行业大数据分析系统的设计与实现

    摘    要 汽车行业是一个竞争激烈的行业,数据分析在该行业中扮演着越来越重要的角色。因此,基于Python的汽车行业大数据分析系统拥有着广阔的应用前景和市场需求。在这个系统中,我们利用Python语言的高效性和易用性,结合数据挖掘和机器学习技术,可以对汽车行业

    2024年02月06日
    浏览(34)
  • CAN总线报文格式———标准数据帧

    标准数据帧由帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束等组成。 CAN总线空闲时,总线上会输出持续的高电平“1”。当总线空闲时任何连接的单元都可以开始发送新的报文。 SOF是数据帧传输的起始位。发送方(sender)会发送一个显性电平作为SOF,由于总线空闲

    2024年01月22日
    浏览(34)
  • CAN报文格式—Intel与Motorola

    对于CAN协议,一般有两种编码格式:Intel 格式和Motorola格式。使用CAN之前,首先知道协议采用的是哪种格式,否则传输的数据有可能不是想要的效果。那么这两种编码格式有什么区别呢? 一般情况下,对于一个字节的传输,CAN通常是先传输该字节的低位(Lsb),然后传输其高

    2023年04月11日
    浏览(25)
  • CAN转EtherNet/IP网关can协议支持哪两种报文

    你是否曾经遇到过不同的总线协议难以互相通信的问题?远创智控的YC-EIP-CAN网关为你解决了这个烦恼! 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备,它能够将各种CAN总线和ETHERNET/IP网络连接起来,解决不同总线协议之间的通信障碍。作为ETHERNET/IP总线的从站,它可以连接

    2024年02月16日
    浏览(24)
  • 校验和(Checksum)介绍、用Java计算校验和、验证校验和

    校验和(Checksum)参考文献RFC1071:https://www.rfc-editor.org/rfc/rfc1071.html 1)待计算校验和的数据的字节数如果偶数,后面不需要补字节;如果字节数是奇数,在后面补一字节(0x00)。(备注:补的全为0的这个字节仅仅是计算校验和使用,并不发送出去) 2)将每两个相邻的字节作

    2024年02月03日
    浏览(32)
  • CAN报文多帧,首帧,流控帧,连续帧

    数据发送为单帧,所以06代表发送的数据中含有6个字节,回复为正反馈,为连续帧。10 代表连续帧的首帧,1E代表此连续帧含有30个字节,30代表此连续帧的流控制帧,21,22,23,24代表连续帧中的第几帧,21代表第一帧,22代表第二帧,依此类推,其中AA为填充位。 针对首帧而

    2024年02月11日
    浏览(24)
  • CAN通讯配置及接收报文--学习笔记1~2

    硬件设备 STM32F103C8T6工控板、USB转TLL接口、TLL转CAN串口小板,继电器,降压模块,警示灯 软件工具 CANPro协议分析平台、CubeMX、MDK-ARM 实现过程及功能 基础功能:PC端通过CANPro设置报文,发出串口信号经过USB和串口小板转成CAN信号,在单片机上接收特定ID的报文,通过判断需要

    2024年02月09日
    浏览(30)
  • ARM---CAN2.0B读取 汽车BMS报文

    Qt CAN编程1- CAN总线整体介绍 - 简书 STM32---CAN2.0B读取新能源汽车BMS报文-CSDN博客 CAN通信标准帧和扩展帧介绍_can扩展帧-CSDN博客 【精选】详解CAN 2.0协议_can2.0-CSDN博客 QT实现CAN通信_五个板栗的技术博客_51CTO博客 linux CAN通讯基于Qt代码编写_pf_can-CSDN博客 QT 新手小白USBCAN 学习_qt ca

    2024年01月21日
    浏览(31)
  • 公开密钥加密之RSA算法【概念+计算+代码实现】

    🌈推荐阅读:http://t.csdn.cn/nQfIY🔥 安全算法:公开密钥加密之RSA算法 公开密钥加密(又称“非对称加密”)是加密和解密使用不同密钥的一种加密方法。包括公开密钥和私有密钥(成对生成的,网上有工具网站)。 公开密钥(public key,后面简称P):加密用的密钥 私有密钥

    2023年04月17日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包