看大家最近都在玩CRC,正好我也碰上了工程需要,就发点刚学的东西凑热闹。话说485的稳定性真是不敢恭维啊,特别是某些表就没有几次正确的码!
CRC计算比较费时,使用查表法确实能减少计算时间,但是当CRC用于Modbus中的校验时,可以利用串行通信的间隔时间来进行CRC的分步计算,先看子程序,语言风格是C51。
#include "CRC16.h"
unsigned char code _auchCRCHi[] ={.........};
unsigned char code _auchCRCLo[] = {.........};
unsigned char data CRC_L,CRC_H; //CRC结果寄存器
void CrcReset() //重置CRC寄存器
{
CRC_L=0xff;
CRC_H=0xff;
}
void Crc16(unsigned char c) //更新一个字节,计算新的CRC
{
c ^= CRC_H;
CRC_H =(CRC_L ^ _auchCRCHi[c]);
CRC_L = _auchCRCLo[c];
}
这样,每次串口来一个新的数据时,就可以调用一次Crc16(unsigned char c),更新CRC校验码,系统不会因为计算较长的CRC校验而出现明显的卡壳,使系统运行更平稳流畅。开始新计算时,需要调用CrcReset以初始化CRC寄存器的值。
写完了以后,发现CRC真的是很简单。夜里手头没单片机,先占位~天亮了验证。