这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » CRC要插空算

共4条 1/1 1 跳转至

CRC要插空算

高工
2013-03-14 01:14:25     打赏

看大家最近都在玩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真的是很简单。夜里手头没单片机,先占位~天亮了验证。





关键词: CRC    

高工
2013-03-14 13:54:35     打赏
2楼
程序正确可用,但是使用的时候,需要注意下所谓的高低位顺序,好像,CRC_H就是传说中的低位,放在前面,而CRC_L 是CRC的高位,放在后面,所以本身就是高低混乱的。。。。。

院士
2013-03-20 10:26:53     打赏
3楼

在modbus-rtu帧格式里,crc16的确是高位在后面,低位在前面。

RS485通讯中使用的是半双工通讯,因此,其总线使用及中裁机制相关重要。楼主再仔细检查总线的使用及匹配电阻,我这边测试的rs485通讯的错误帧很少很少的。


高工
2013-03-21 11:53:13     打赏
4楼
嗯,是我之前的那个表头有问题,现在已经换货了,效果不错。不过,拖那个破表头的福,我到是写了一个自我感觉比较稳健的MODBUS接收校验,但是程序可读性不强,封装性也不强,所以暂时不好意思贴出来。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]