CRC-16 / MODBUS 校验计算方法二

单片机在传输modbus数据的时候需要进行crc校验,本文介绍另一种校验方法;

第一步   设置一个16位寄存器,例如为:jicun ;寄存器初始值为 0xFFFF。

第二步 CRC-16 / MODBUS的多项式为0xA001。

第三步 开始计算,把需要校验的字节与寄存器的低位相异或,结果仍存在寄存器;

    例如:                 jicun = zijie1 ^ jicun

第四步:难点来了,注意此步分两种情况,

           A:判断寄存器的最低比特位,如果为1:寄存器先右移1位,再与A001H进行异或,结果仍然存回jicun。

          B:        寄存器的最低比特位,如果为0:寄存器只右移1位,结果仍然存回jicun。

好了如此重复8次,一个字节校验完毕;

第五步 把结果送达相关需要的地方;

#include "reg51.h"
unsigned char crchi;        //存放校验值的高字节;
unsigned char crclo;        //存放校验的值低字节;
unsigned char test[] ={0x5a,0x07,0xf0,0x0f,0xe7,0xff,0x00,0x00};  
unsigned int result;   //用于校验的数组,多两位以便校验以后把校验数值填进去;

unsigned int crc16( unsigned char Len)
{
    unsigned int temp = 0xffff;
   	unsigned char n,i;
  
    for( n = 0; n < Len; n++)	         //此处的Len是要校验的字节数。
	{       
        temp = test[n] ^ temp;
        for( i = 0;i < 8;i++)            //每一个字节8bit,每bit都要处理。
		{ 
            if(temp & 0x01)
			{
                temp = temp >> 1;
                temp = temp ^ 0xa001;
            }   
            else
			{
                temp = temp >> 1;
            }   
        }   
    }   
 return temp;                          
 }  
//以下为主函数;
void main()
{
	while(1)
	{
	result=crc16( 6);
	crclo=result;
	crchi=result>>8;
	test[6]	=crclo;
	test[7]=crchi;
   }
}

 

你可能感兴趣的:(单片机技术)