[单片机] crc16算法

发布者:CW13236066525最新更新时间:2022-09-20 来源: csdn关键字:单片机  CRC校验 手机看文章 扫描二维码
随时随地手机看文章

什么是CRC校验

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。奇偶校验虽然简单,但是漏检率太高,而CRC则要低的多,所以大多数都是使用CRC来校验。CRC也称为多项式码。


循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,进而可以保证在软件层次上数据传输的正确性和完整性。


 #include "crc16.h"

 

 /** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */

static unsigned short const crc16_table[] = {

0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,

0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,

0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,

0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,

0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,

0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,

0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,

0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,

0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,

0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,

0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,

0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,

0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,

0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,

0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,

0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,

0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,

0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,

0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,

0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,

0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,

0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,

0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,

0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,

0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,

0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,

0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,

0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,

0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,

0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,

0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,

0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040

};


/**

 * crc16 - compute the CRC-16 for the data buffer

 * @crc: previous CRC value

 * @buffer: data pointer

 * @len: number of bytes in the buffer

 *

 * Returns the updated CRC value.

 */

 

static unsigned short crc16_byte(unsigned short crc, const unsigned char data)

{

return (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff];

}

unsigned short crc16(unsigned short crc, unsigned char const *buffer, unsigned int len)

{

while (len--)

crc = crc16_byte(crc, *buffer++);

return crc;

}


/*

 * crc16.h - CRC-16 routine

 *

 * Implements the standard CRC-16:

 *   Width 16

 *   Poly  0x8005 (x^16 + x^15 + x^2 + 1)

 *   Init  0

 */


#ifndef __CRC16_H

#define __CRC16_H


#ifdef __cplusplus

unsigned short crc16(unsigned short crc, const unsigned char *buffer, unsigned int len);


#endif /* __CRC16_H */


在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB移位后已经被移出CRC寄存器)如果为,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位,所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

CRC校验工具http://www.metools.info/code/c15.html


// -----------------------------------------------------------------

// CRC16计算方法3:使用直接结算的方法

// -----------------------------------------------------------------

WORD CRC16_3(BYTE* pchMsg, WORD wDataLen)

{

BYTE i, chChar;

WORD wCRC = 0xFFFF;


while (wDataLen--)

{

chChar = *pchMsg++;

chChar = ByteInvert(chChar);


wCRC ^= (((WORD) chChar) << 8);


for (i = 0; i < 8; i++)

{

if (wCRC & 0x8000)

wCRC = (wCRC << 1) ^ CRC_16_POLYNOMIALS;

else

wCRC <<= 1;

}

}


wCRC = WordInvert(wCRC);


return wCRC;

}

关键字:单片机  CRC校验 引用地址:[单片机] crc16算法

上一篇:[单片机] crc32
下一篇:[单片机] rsa2048签名算法

推荐阅读最新更新时间:2024-11-11 10:56

C51单片机学习(二):中断系统和定时器
中断系统: 中断概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 中断的结构图 其中一些说明: 1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降 沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时, 中断标志IE0(TCON.1)置1,向CPU申请中断。 2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中
[单片机]
C51<font color='red'>单片机</font>学习(二):中断系统和定时器
PIC单片机与PC机实现串行通信的设计
1.实例目的: 本实例完全建立在计算机软件的基础上,利用PROTEUS软件构建一个单片机系统,利用VB编写一个计算机控制软件和单片机系统串行通信,计算机上的控制软件可以发送一个值在0——999之间的数,在单片机系统上显示出来,单片机系统上也可输入一个相同值域的数并在计算机控制软件上显示出来。本实例主要是为了展示虚拟串行通信的仿真。 2.系统配置 本实例虽然简单,但是要想看到想要的仿真结果,建立虚拟的串口连接是必不可少的。要想仿真串行通信,必须要把单片机系统上的串行口与计算机上的串行口连接,这样他们之间才能传输数据,但由于是仿真,实际没有相连接,所以需要创建一对虚拟串行口并使他们相连,这里我使用的是这个软件Virtual Ser
[单片机]
PIC<font color='red'>单片机</font>与PC机实现串行通信的设计
ARM7单片机(学习ing)—(KZ)、PLL(锁相环)—01
找了半天还是没有找到关于Proteus仿真LPC2106的频率设置~~ 还有就是暂时还看不懂Startup.s~~ 所以不知道它是怎么设置的~~ 不过这里先整理一下PLL~~ PLL(锁相环): 寄存器描述: a、PLLCON寄存器(PLLCON—0X301FC080) b、PLLCFG寄存器(PLLCFG—0XE01FC084) c、PLLSTAT寄存器(PLLSTAT—0XE01FC088) d、PLLFEED寄存器(PLLFEED—0XE01FC08C) PLL中断 PLLSTAT寄存器中的PLOCK位连接到中断控制器。这样可以使用软件打开PLL并连接到其它功能,不需要等待PLL锁定。
[单片机]
ARM7<font color='red'>单片机</font>(学习ing)—(KZ)、PLL(锁相环)—01
英飞凌推出AURIX™微控制器,加速汽车的电气化和数字化进程
英飞凌推出新一代AURIX™微控制器,加速汽车的电气化和数字化进程 【2022年1月14日,德国慕尼黑讯】未来出行的重要趋势是碳中和、自动驾驶、互联和信息安全。而微电子技术将在出行方式的转型中发挥核心作用。作为全球车用半导体市场的领导者,英飞凌科技股份公司持续以科技创新引领未来出行。该公司近日宣布推出采用28纳米工艺技术生产的新AURIX™ A TC4x系列微控制器(MCU),进一步增强其AURIX™ 微控制器家族的产品阵容。AURIX™ TC4x系列微控制器可广泛应用于新一代电动汽车、高级驾驶辅助系统(ADAS)、汽车电子/电气(E/E)架构以及人工智能(AI)应用等。 英飞凌科技汽车电子事业部总裁Peter Sc
[汽车电子]
英飞凌推出AURIX™<font color='red'>微控制器</font>,加速汽车的电气化和数字化进程
ARM小记
ARM何物 ARM(Advanced RISC Machines,进阶精简指令集机器),如果你一直把这个单词读成“A”-“R”-“M”,那么将有一个好消息和一个坏消息要告诉你。好消息是:你 这是初次接触到ARM技术相关的文章,而本文内容正是专为你量身打造的,无论你是嵌入式系统的门外汉还是单片机技术的初学者,都可以通过本文轻松地了解ARM技术。 请相信我,这并不困难!坏消息是:我很抱歉的告诉你, 它的正确读法应该是“arm”,是手臂、胳膊的英文发音。 很出丑是不是?但除非你是在大声朗读,不然没人会知道 的。你又多了一个知识和一个不可告人的秘密。调整一下心态,我们的故事就从这里开始吧! 1990年,有一家高科技公司在美丽的英国安
[单片机]
ARM小记
单片机中的一些寄存器属于cpu还是IRAM
问题:单片机8051中的一些寄存器到底算CPU的还是RAM的? 请高手指点,像累加器DPTR,A,PSW等一些寄存器是属于CPU的,但书上又说他们都属于RAM中的特殊功能寄存器(SFR),这是什么道理? 另外,存储器和寄存器不是两个功能,结构都不同的东西么?为什么RAM中存在许多寄存器组,即二者在此是相同的? 完整解答出自 https://www.zhihu.com/question/52153683 综合理解:有以下几种可能: 1、CPU是一个抽象的概念,如同操作系统这个概念一样没有明确的界线;(cpu是由人划分出来的一块区域不明确) 2、CPU这个概念不适用与51; 3、51可以划分CPU和RAM部分,但CPU和RAM有
[单片机]
芯鼎盛微控制器MCU典型应用消毒牙刷盒
消毒光源采用UVC+UVA短波LED紫外光,分别为光波长200~275nm和320~420nm的紫外线。UVC深紫外杀菌是目前常用的消杀技术。深紫外可以释放较高能量,对细菌病毒的作用十分明显,通过破坏其内部的DNA结构,照射后可对细菌病毒直接杀灭。UVA用于产生视觉效果,增加消费者的体验感。 消毒牙刷盒电路图V1.0 消毒牙刷盒原理图 技术参数: 供电电压:3V(2节5号电池);静态功耗: 5uA;消毒时间:5分钟;消毒工作电流: 160mA;环境温度:-20℃~+65℃;环境湿度:30%RH~80%RH。 消毒牙刷盒效果图
[嵌入式]
芯鼎盛<font color='red'>微控制器</font><font color='red'>MCU</font>典型应用消毒牙刷盒
MCS-51单片机的中央处理器CPU介绍
MCS-51单片机的中央处理器CPU由运算器和控制逻辑构成,其中包括若干特殊功能寄存器(SFR)。 一、以ALU为中心的运算器 算术逻辑单元ALU能对数据进行加、减、乘、除等算术运算;“与”、“或”、“异或”等逻辑运算以及位操作运算。 PSW的格式如图1-3所示,其各位的含义是: 图1-3 PSW的格式 CY:进位标志。有进位/借位时CY=1,否则CY=0; AC:半进位标志。当D3位向D4位产生进位/借位时AC=1,常用于十进制调整运算中; F0:用户可设定的标志位,可置位/复位,也可供测试。 RS1、RS0:四个通用寄存器组的选择位,该两位的四种组合状态用来选择0~3寄存器组。见表1-2。 OV:
[单片机]
MCS-51<font color='red'>单片机</font>的中央处理器CPU介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved