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

什么是CRC校验?

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

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

CRC-16校验码的应用

根据Modbus协议,常规485通讯的信息发送形式如下:

地址 功能码 数据信息 校验码
1byte 1byte N byte 2byte

其中2 Byte的校验码一般就是采用CRC16。

我们之前的网文《485型风速和风向变送器数据包解析》中介绍的通讯协议就是16位CRC码。

CRC-16校验码计算方法

1. 计算法

此方法缺点是计算量大,有时不方便使用在单片机中。

unsigned int calccrc(unsigned char crcbuf, unsigned int crc)
{unsigned char i;crc = crc ^ crcbuf;for (i = 0; i < 8; i++){unsigned char chk;chk = crc & 1;crc = crc >> 1;crc = crc & 0x7fff;if (chk == 1)crc = crc ^ 0xa001;crc = crc & 0xffff;}return crc;
}unsigned int chkcrc(unsigned char *buf, unsigned char len)
{unsigned char hi, lo;unsigned int i;unsigned int crc;crc = 0xFFFF;for (i = 0; i < len; i++){crc = calccrc(*buf, crc);buf++;}hi = crc % 256;lo = crc / 256;crc = (hi << 8) | lo;return crc;}

2. 查表法

速度快,语句少,但表格占用一定的程序空间。

// 逆序CRC表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};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
};unsigned short GetQuickCRC16(unsigned char * pBuffer, int Length)
{unsigned char CRCHi = 0xFF;unsigned char CRCLo = 0xFF;unsigned char iIndex = 0;for (int i = 0; i < Length; i++){iIndex = CRCHi ^ pBuffer[i];CRCHi = CRCLo ^ aucCRCHi[iIndex];CRCLo = aucCRCLo[iIndex];}return (unsigned int)( CRCHi << 8 | CRCLo);// CRC校验返回值
}

函数调用

int main()
{unsigned char checkBitLow, checkBitHig;unsigned char pCharData[6] = { 0x01 ,0x03,0x00,0x00,0x00,0x02 };unsigned int crc = chkcrc(pCharData, 6);checkBitLow = (unsigned char)(crc & 0xff); //校验位低8位checkBitHig = (unsigned char)((crc >> 8) & 0xff); //校验位高8位printf ("chkcrc checkBitLow:%02X checkBitHig:%02X \n", checkBitHig,
checkBitLow);crc = GetQuickCRC16(pCharData, 6);checkBitLow = (unsigned char)(crc & 0xff);checkBitHig = (unsigned char)((crc >> 8) & 0xff);printf("GetQuickCRC16 checkBitLow:%02X checkBitHig:%02X \n", checkBitHig, checkBitLow);
}

测试结果:

在线CRC校验网址

将 01 03 00 00 00 02 代入下面网址验证:

  1. CRC在线校验地址

    https://www.lammertbies.nl/comm/info/crc-calculation.html

  1. 专门的在线校验计算器:16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器

    https://www.23bei.com/tool-59.html

  1. CRC校验工具

    http://www.metools.info/code/c15.html

分享、点赞、在看三连

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

CRC校验码简介及CRC16的计算方法相关推荐

  1. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

  2. CRC校验码(附CRC7校验代码)

    前言 CRC校验码其实很简单,详细的去网上查,我这里就简单讲讲 CRC校验码简介 crc校验码其实就是对数据进行模二除法的得出来的余数(模二除法上网查) 模二除法的被除数是数据,除数是校验码对应的多项 ...

  3. CRC基础及CRC8和CRC16的计算方法说明简介

    参考链接:https://blog.csdn.net/Chuck_lin/article/details/79199381 https://blog.csdn.net/chen249191508/ar ...

  4. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释

    CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注 ...

  5. 【信道编码/Channel Coding】CRC校验码

    简介: 这是本专栏信道编码/Channel Coding的第四站,想对信道编码有一个系统性的认识可以看本专栏的 信道编码的整体框架 一文.而在本篇文章中,将介绍CRC校验码的基本原理. 目录 简介: ...

  6. 16位CRC校验码计算,485MODBUS计算

    CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该C ...

  7. 详述CRC校验码(附代码)

    关注+星标公众号,不错过精彩内容 来源 | 一口Linux CRC校验应用比较广泛,通常在通信领域用的比较多,即便是自定义通信协议,也可以添加CRC校验码,使其通信更加可靠. 今天就来进一步描述CRC ...

  8. 一文讲透CRC校验码-附赠C语言实例

    一口君最近工作用到CRC校验,顺便整理本篇文章和大家一起研究. 一.CRC概念 1. 什么是CRC? CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和. ...

  9. PLC中用scl语言编写算法求解modbus crc校验码

    PLC中用scl语言编写算法求解modbus crc校验码 因为不是严格的modbus协议,是用的自由口通讯,传输数据里面得加上CRC校验,所以得搞个算法根据发送不同的数据生成相应的CRC校验码. 现 ...

最新文章

  1. tensorflow中转置卷积运算例子
  2. java非递归方式实现快速排序
  3. Java SE 6 新特性: HTTP 增强--转
  4. php连接数据库封装函数,PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】...
  5. svm多分类代码_跟我一起机器学习系列文章知识点与代码索引目录,持续更新…...
  6. android 安装assets中的apk,如何安装assets下apk,附源码(原创)
  7. friendly发音_friendly是什么意思_friendly怎么读_friendly翻译_用法_发音_词组_同反义词_友好的_亲密的-新东方在线英语词典...
  8. 英语总结系列(二十二):Baby偶遇GCT
  9. 设计模式(Design Patterns)
  10. 3串口多串口双串口以及2串口UART转WiFi多跳通讯实现三
  11. sm缩写代表什么意思_狗狗各种表情都分别代表着什么意思
  12. 完蛋,公司被一条 update 语句干趴了!
  13. ME525做网络收音机和学外文用了……(安卓4.4.4系统,20190817更新)
  14. Origin绘图 默认字体设置
  15. Android 6.0系统中图片剪切空指针崩溃问题解决纪录
  16. ArcGIS 切片/瓦片的发布与加载
  17. (财务应用程序:比较不同利率下的贷款)编写程序,让用户输入贷款总额和以年为单位的贷款期限,然后显示利率从5%到8%,每次递增1/8的过程中,每月的支付额和总支付额
  18. Win10家庭版找不到组策略gpedit.msc
  19. 词表大小越界错误 indexSelectLargeIndex
  20. Selenium.Chrome相关配置及用法

热门文章

  1. string 中关于 npos 的使用方法详解
  2. Docker修改daemon.json配置,不需要重启docker或daemon-reload
  3. 月亮网摘(2005.08.15)
  4. 海信发布城市智慧心脏1.0
  5. unity相机脚本 鼠标滚轮控制缩放
  6. 保护计算机系统的方法有,保护计算机中秘密的方法有哪些?
  7. 台湾之星成台湾第四大电信运营商
  8. java抓取网页代码_java 抓取网页内容实现代码
  9. java+mysql 实现实体的映射与翻译
  10. SwiftUI之猜国旗APP及色彩类控件