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

点击上方“嵌入式从0到1”,选择“置顶/星标公众号

干货福利,第一时间送达!

什么是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获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着科技的飞速发展,电子设备间的连接与数据传输变得越来越重要。Type-C转接头作为连接各种设备的桥梁,其性能与标准也不断升级。本文将详细探讨Type-C转接头2.0与3.1之间的区别,帮助读者更好地理解和选择适合自己的...

关键字: 电子设备 数据传输 Type-C

随着科技的不断进步,移动通信技术也迎来了飞速的发展。从最初的2G时代到如今的5G时代,每一次技术的升级都为我们带来了更快捷、更便利的通信体验。作为最新一代的移动通信技术,5G以其超高速率、低时延和大连接数的特点,正逐步改...

关键字: 移动通信 数据传输 5G

随着信息技术的飞速发展,数据通信作为连接世界的桥梁,其重要性日益凸显。为了确保数据通信的高效、稳定和可靠,我们需要关注一系列关键的技术指标。本文将深入解析数据通信的主要技术指标,并探讨其前沿发展。

关键字: 数据通信 数据传输

船载通信系统是现代船舶中不可或缺的重要组成部分,它为船舶提供了与外界通信和数据传输的渠道。船载通信系统行业设计方案涵盖了多个方面,包括系统架构、硬件设备、软件系统、通信协议等。本文将详细介绍船载通信系统的行业设计方案。

关键字: 船载通信 数据传输 通信协议

12月22日,由广州日报主办的2023年高质量发展年度峰会在广州举行。OPPO凭借持续创新和技术积累,入选2023年广东创新TOP100榜10强,展现出在科技创新领域的领先实力。

关键字: 智能手机 数据传输

短距离无线通信技术是一种利用无线电波进行数据传输的技术,适用于距离较短、对传输速率要求不高的场景。近年来,随着物联网、智能家居等技术的不断发展,短距离无线通信技术也得到了广泛应用。本文将对常见的短距离无线通信技术进行介绍...

关键字: 无线通信 数据传输 物联网

数字通信是指以数字信号作为载体来传输消息,或用数字信号对载波进行数字调制后再传输的通信方式。它可传输电报、数字数据等数字信号,也可传输经过数字化处理的语声和图像等模拟信号。在数字通信中,信号通常是经过抽样、量化和编码后形...

关键字: 数字通信 数据传输

通信模块的作用是实现数据传输和通信。通信模块可以将数据从一台设备传输到另一台设备,或者在一个设备内部的不同部件之间进行传输。通信模块的应用非常广泛,包括工业自动化、电力系统、安防监控、智能家居、医疗设备、交通工具等领域。

关键字: 通信模块 数据传输

串口通信,也称为串行通信,是一种数据传输方式,它按照二进制位(bit)顺序进行数据传输。在串口通信中,数据从一个设备(发送器)的串口发送到另一个设备(接收器)的串口,这两个设备通过共享的通信通道进行通信。

关键字: 串口通信 数据传输

日前,智慧芽发布《2023年度中国科创力坐标报告》和《2023年度全球科创力坐标》,OPPO凭借持续创新和技术积累,入选2023年全球科创领袖TOP100、中国科创领袖TOP100榜单,展现出在科技创新领域的领先实力。

关键字: OPPO 数据传输 中国科创领袖TOP100
关闭
关闭