『7x24小时有问必答』
#ifndef _CRC_H_#define  _CRC_H_static  const  unsigned  char  aucCRCHi[] = {       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x01,  0xC0,  0x80,  0x41,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x01,  0xC0,  0x80,  0x41,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x00,  0xC1,  0x81,  0x40,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x00,  0xC1,         0x81,  0x40,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40,  0x01,  0xC0,         0x80,  0x41,  0x01,  0xC0,  0x80,  0x41,       0x00,  0xC1,  0x81,  0x40};static  const  unsigned  char  aucCRCLo[] = {       0x00,  0xC0,  0xC1,  0x01,  0xC3,  0x03,         0x02,  0xC2,  0xC6,  0x06,  0x07,  0xC7,       0x05,  0xC5,  0xC4,  0x04,  0xCC,  0x0C,         0x0D,  0xCD,  0x0F,  0xCF,  0xCE,  0x0E,       0x0A,  0xCA,  0xCB,  0x0B,  0xC9,  0x09,         0x08,  0xC8,  0xD8,  0x18,  0x19,  0xD9,       0x1B,  0xDB,  0xDA,  0x1A,  0x1E,  0xDE,         0xDF,  0x1F,  0xDD,  0x1D,  0x1C,  0xDC,       0x14,  0xD4,  0xD5,  0x15,  0xD7,  0x17,       0x16,  0xD6,  0xD2,  0x12,  0x13,  0xD3,       0x11,  0xD1,  0xD0,  0x10,  0xF0,  0x30,         0x31,  0xF1,  0x33,  0xF3,  0xF2,  0x32,       0x36,  0xF6,  0xF7,  0x37,  0xF5,  0x35,         0x34,  0xF4,  0x3C,  0xFC,  0xFD,  0x3D,       0xFF,  0x3F,  0x3E,  0xFE,  0xFA,  0x3A,         0x3B,  0xFB,  0x39,  0xF9,  0xF8,  0x38,       0x28,  0xE8,  0xE9,  0x29,  0xEB,  0x2B,         0x2A,  0xEA,  0xEE,  0x2E,  0x2F,  0xEF,       0x2D,  0xED,  0xEC,  0x2C,  0xE4,  0x24,         0x25,  0xE5,  0x27,  0xE7,  0xE6,  0x26,       0x22,  0xE2,  0xE3,  0x23,  0xE1,  0x21,         0x20,  0xE0,  0xA0,  0x60,  0x61,  0xA1,       0x63,  0xA3,  0xA2,  0x62,  0x66,  0xA6,         0xA7,  0x67,  0xA5,  0x65,  0x64,  0xA4,       0x6C,  0xAC,  0xAD,  0x6D,  0xAF,  0x6F,         0x6E,  0xAE,  0xAA,  0x6A,  0x6B,  0xAB,       0x69,  0xA9,  0xA8,  0x68,  0x78,  0xB8,         0xB9,  0x79,  0xBB,  0x7B,  0x7A,  0xBA,       0xBE,  0x7E,  0x7F,  0xBF,  0x7D,  0xBD,         0xBC,  0x7C,  0xB4,  0x74,  0x75,  0xB5,       0x77,  0xB7,  0xB6,  0x76,  0x72,  0xB2,         0xB3,  0x73,  0xB1,  0x71,  0x70,  0xB0,       0x50,  0x90,  0x91,  0x51,  0x93,  0x53,         0x52,  0x92,  0x96,  0x56,  0x57,  0x97,       0x55,  0x95,  0x94,  0x54,  0x9C,  0x5C,         0x5D,  0x9D,  0x5F,  0x9F,  0x9E,  0x5E,       0x5A,  0x9A,  0x9B,  0x5B,  0x99,  0x59,         0x58,  0x98,  0x88,  0x48,  0x49,  0x89,       0x4B,  0x8B,  0x8A,  0x4A,  0x4E,  0x8E,         0x8F,  0x4F,  0x8D,  0x4D,  0x4C,  0x8C,       0x44,  0x84,  0x85,  0x45,  0x87,  0x47,         0x46,  0x86,  0x82,  0x42,  0x43,  0x83,       0x41,  0x81,  0x80,  0x40};//核心宏函数#define  macrocrc16(data,crc)\do{\crc=(aucCRCHi[(crc^data)&0xff]^(crc>>8))|\((unsigned  int)aucCRCLo[(crc^data)&0xff]<<8);\}while(0)#endif
以上写入CRC.h
以下为调用方法
//标准头文件使用<>#include  <stdio.h>//自定义头文件使用""#include  "CRC.h"unsigned  char  buf[20] = {  0x01,0x10,0x00,0x01,0x00,0x02,0x04,0x00,0x01,0x02,0x58  };unsigned  short  int  crc;int  main(){int  i;//First must be let crc= 0xffffcrc =  0xffff;for  (i =  0; i <  11; i++){macrocrc16(*(volatile  unsigned  char*)(buf + i), crc);}//Low Byte  *(volatile  unsigned  char*)(buf + i++) = crc;//High Byte*(volatile  unsigned  char*)(buf + i) = crc >>  8;for  (i =  0; i <  13; i++){printf("%02x ", buf);}return  0;}

CRC16校验原理

CRC16(16位循环冗余校验)是一种基于多项式除法的错误检测算法,其核心原理如下:
数学基础
将待校验数据视为二进制多项式,与生成多项式进行模2除法(异或运算)
示例中aucCRCHiaucCRCLo是预计算的256字节查找表,存储所有可能输入(0-255)对应的CRC高8位和低8位值
算法实现
define  macrocrc16(data,crc) do{ \       crc=(aucCRCHi[(crc^data)&0xff]^(crc>>8))|((unsigned int)aucCRCLo[(crc^data)&0xff]<<8); \ }while(0)  
每次处理1字节数据,通过异或(^)和位移(>>)操作更新CRC值
aucCRCHiaucCRCLo表通过预计算优化了计算效率
表生成原理
两个表分别存储CRC16的高8位和低8位计算

工程应用

典型应用场景
串行通信(UART/RS485)的数据完整性校验
网络协议(如Modbus、CAN总线)的帧校验
存储介质(EEPROM、Flash)的数据校验
优势特点
检测突发错误能力强
计算速度快(尤其配合查找表)
硬件实现简单(仅需移位寄存器和异或门)

</stdio.h>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码