编程示例: 计算CRC校验码

news/2024/12/2 16:41:27/

编程示例: 计算CRC校验码

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

CRC-16校验码的应用
根据Modbus协议,常规485通讯的信息发送形式如下:

地址 功能码 数据信息 校验码
1byte 1byte N byte 2byte
其中2 Byte的校验码一般就是采用CRC16。

CRC的算法种类
CRC-16 ,CRC-32等它们使用不同的生成多项式
CRC-16 MODBUS 使用的多项式是x^16+x^15+x^2+1
写成十六进制是0x8005 ,它的反向的序的值是0xa001。

生成CRC有两个算法,一个是直接计算,另一个是查表法。

javascript语言的实现的代码如下:

<html>
<title>计算CRC校验码</title>
<body>
<p>输入十六进制序列:例如 0x01,0x03,0x00,0x00,0x00,0x02</p>
<textarea id='txt2' rows="3" cols="130"></textarea>
<p>校验码:</p><textarea id='result' rows="3" cols="130"></textarea>
<button id="button" οnclick="make_crc()">生成CRC校验码</button>
<script>
 
 var 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

];

var 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
];
/*查表法计算 CRC16 (Modbus)*/
function GetQuickCRC16( pBuffer, Length) 
{
       var CRCHi = 0xFF;
       var CRCLo = 0xFF;
       var iIndex = 0;

       for (var i = 0; i < Length; i++)
       {
              iIndex = CRCHi ^ pBuffer[i];
              CRCHi = CRCLo ^ aucCRCHi[iIndex];
              CRCLo = aucCRCLo[iIndex];
       }
       return ( CRCHi << 8 | CRCLo);// CRC校验返回值 
}

/*测试用的主程序*/
function make_crc()
{
var arr_str=document.getElementById("txt2").value;
var arr=arr_str.split(',');  
var  pCharData = [0x01,0x03,0x00,0x00,0x00,0x02];

var crc=chkcrc(arr,6);//GetQuickCRC16(arr,6);//(pCharData, 6)
 var checkBitLow = (crc & 0xff);
 var checkBitHig = ((crc >> 8) & 0xff);
document.getElementById("result").innerText= '低字节是 '+(checkBitHig).toString(16)+'   高字节是 '+parseInt(checkBitLow).toString(16);
}

function calccrc(crcbuf,  crc)
{
       var i;
       crc = crc ^ crcbuf;

       for (i = 0; i < 8; i++)
       {
              var chk;
              chk = crc & 1;
              crc = crc >> 1;
              crc = crc & 0x7fff;

              if (chk == 1)
              { crc = crc ^ 0xa001;}

              crc = crc & 0xffff;
       }
       return crc;
}
/*直接计算 CRC16 (Modbus)*/
function chkcrc(buf,  len)
{
       var hi, lo;
      var i;
       var crc;
       crc = 0xFFFF;

       for (i = 0; i < len; i++)
       {
              crc = calccrc(buf[i], crc);            
       }

       hi = crc % 256;
       lo = crc / 256;
       crc = (hi << 8) | lo;
       return crc;
}
</script>
</body>
</html>

在web页上的计算结果如下:

 


http://www.ppmy.cn/news/387970.html

相关文章

经典文献阅读之--A Review of Motion Planning(轨迹规划回顾)

0. 简介 对于自动驾驶以及机器人而言&#xff0c;除了SLAM以外&#xff0c;另一个比较重要的部分就是轨迹规划了。而最近作者看到了几篇比较好的文章&#xff0c;分别为《A Review of Motion Planning Techniques for Automated Vehicle》、《A review of motion planning alg…

C++初阶—list深度解剖及模拟实现

目录 ➡️0. 前言 &#x1f60a;1.简易框架实现 &#x1f414;1. list和__list_node分析实现 &#x1f414;2. 无参构造 &#x1f60a;2.迭代器实现 &#x1f414;1. list普通迭代器面临问题及解决方案 &#x1f414;2. __list_node\iterator\list三类分析 &#x1f41…

VALSE 2023 无锡线下参会个人总结 6月11日-2

VALSE2023无锡线下参会个人总结 6月11日-2 6月11日会议日程安排Workshop&#xff1a;目标检测与分割程明明&#xff1a;粒度自适应的图像感知技术张兆翔&#xff1a;基于多传感器融合的视觉物体检测与分割 Workshop&#xff1a;ChatGPT与计算机视觉白翔&#xff1a;再谈ChatGPT…

三星Android Pie软件,至少在AndroidPie版本上的三星GalaxyS9现在具有缺陷检测功能

昨天&#xff0c;我们获得了在 Qualcomm Snapdragon Samsung Galaxy S9 上运行的最新版本的Samsung Experience&#xff0c;即Samsung Experience 10 。在最新更新中&#xff0c;我们还有很多要做的工作&#xff0c;到目前为止&#xff0c;我们已经看到了完全重新设计的用户界…

三星s9 测试性能软件,三星Galaxy S9+屏幕、性能和续航评测:这台机皇不止有点强...

拼 命 加 载 中 ... 三星Galaxy S9+在上周五正式开卖,作为三星今年最重要的旗舰级手机,我们此前也分享了上手体验感受,但相信不少有意购买的用户或玩家不够喉,还想知道更多关于三星机皇的表现,所以这里先为大家带来Galaxy S9+的屏幕、性能和续航三项测试,帮助大家对其有更…

软件测试面试题整理(二)之测试用例集

https://blog.csdn.net/weixin_45912307/article/details/109457138 1. 设计一个登录页面的用例 功能测试&#xff1a; 正确输入、为空输入、字符类型校验、长度校验、密码是否加密显示、大写提示、跳转页面是否成功、登出后用另一个账号登录 UI&#xff1a; 界面布局合理、风格…

软件测试面试题整理(六)之app测试篇

https://blog.csdn.net/weixin_45912307/article/details/109501092 1. Web 端测试和 App 端测试有何不同&#xff08;常见&#xff09; 系统结构方面 Web 项目&#xff0c;b/s架构&#xff0c;基于浏览器的&#xff1b;Web 测试只要更新了服务器端&#xff0c;客户端就会同步…

软件测试流程(完整版)

单纯从功能测试层面上来讲的话&#xff0c;APP测试、web测试在流程和功能测试上是没有区别的 根据两者载体不一样&#xff0c;则区别如下&#xff1a; 1.系统结构方面 web项目&#xff1a;b/s架构&#xff0c;基于浏览器的&#xff1b;web测试只要更新来服务器端&#xff0c;…