网站开发费用明细,做网站 用什么语言,郑州专业网站制作,厦门小型网站建设CRC-16 / MODBUS #xff1a;
1#xff09;CRC寄存器初始值为 FFFF#xff1b;即16位全为1#xff1b;
2#xff09;CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数#xff0c;‘B’表示二进制数
计算步骤为#xff1a; (1).预置 16 位寄存…CRC-16 / MODBUS
1CRC寄存器初始值为 FFFF即16位全为1
2CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数‘B’表示二进制数
计算步骤为 (1).预置 16 位寄存器为十六进制 FFFF即全为 1 称此寄存器为 CRC 寄存器 (2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或把结果放于 CRC 寄 存器
(3).检测相异或后的CRC寄存器的最低位若最低位为1CRC寄存器先右移1位再与多项式A001H进行异或若为0则CRC寄存器右移1位无需与多项式进行异或。
(4).重复步骤 3 直到右移 8 次这样整个 8 位数据全部进行了处理 (5).重复步骤 2 到步骤4进行下一个 8 位数据的处理 (6).最后得到的 CRC 寄存器即为 CRC 码。
补充 多项式产生 如x16x12x51 x16表示第16位为1x5表示第5位为1 (1 16) | (1 12) | (1 5) | (1) 0x11021 但是CRC16只取低16位写成16进制数就是 0x1021
// Modbus crc16
unsigned short crc16 ( unsigned char *Array, unsigned int Len )
{unsigned int IX, IY, CRC;unsigned char Rcvbuf[2] { 0 };if ( Len 0 )return 0;CRC 0xFFFF;for ( IX 0; IX Len; IX ) //需要处理的数据{CRC CRC ^ ( unsigned int ) ( Array[IX] );for ( IY 0; IY 7; IY ) // 处理1个字节{if ( ( CRC 1 ) ! 0 )CRC ( CRC 1 ) ^ 0xA001;elseCRC CRC 1; }}Rcvbuf[0] ( CRC 0xff00 ) 8; //高位Rcvbuf[1] ( CRC 0x00ff ); //低位CRC Rcvbuf[0] 8;CRC Rcvbuf[1];return CRC;
}参考https://blog.csdn.net/u013625451/article/details/81239572?spm1001.2101.3001.6650.6utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_defaultdepth_1-utm_sourcedistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default