推广 热搜:
 |  行业设备  |  机械制造  |  机器视觉  |  机械自动化  |  仪器仪表  |  工业机器人  |  编程开发  |  嵌入式  |  电子技术  |  工控自动化  |  电工电气 频道

常见的两种数据校验方式

   日期:2018-04-16     浏览:110    评论:0    
核心提示:CRC-16(循环冗余错误校验)CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是
 CRC-16(循环冗余错误校验)  

CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制,其最高有效位(MSB)首选发送。报文先与X↑16相乘(左移16位),然后除X↑16+X↑15+X↑2+1,X↑16+X↑15+X↑2+1可以表示为二进制数11000000000000101。整数商位忽略不记,16位余数加入该报文(MSB先发送),成为2个CRC校验字节。余数中的1全部初始化,以免所有的零成为一条报文被接收。经上述处理而含有CRC字节的报文,若无错误,到接收设备后再被同一多项式(X↑16+X↑15+X↑2+1)除,会得到一个零余数(接收设备核验这个CRC字节,并将其与被传送的CRC比较)。全部运算以2为模(无进位)。  
习惯于成串发送数据的设备会首选送出字符的最右位(LSB-最低有效位)。而在生成CRC情况下,发送首位应是被除数的最高有效位MSB。由于在运算中不用进位,为便于操作起见,计算CRC时设MSB在最右位。生成多项式的位序也必须反过来,以保持一致。多项式的MSB略去不记,因其只对商有影响而不影响余数。  
生成CRC-16校验字节的步骤如下:  
①如装一个16位寄存器,所有数位均为1。  
②该16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。  
③把这个16位寄存器向右移一位。  
④若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。  
⑤重复③和④,直至移出8位。  
⑥另外8位与该十六位寄存器进行“异或”运算。  
⑦重复③~⑥,直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。  
⑧这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。  
另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X↑16+X↑15+X↑2+1,首次装入的16位寄存器为0000;使用CRC16的反序X↑16+X↑14+X↑1+1,首次装入寄存器值为0000或FFFFH。

CRC简单函数如下:  
unsigned short CRC16(puchMsg, usDataLen)  
unsigned char *puchMsg ;   
unsigned short usDataLen ;   
{  
unsigned char uchCRCHi = 0xFF ;   
unsigned char uchCRCLo = 0xFF ;   
unsigned uIndex ;   
while (usDataLen--)   
{  
uIndex = uchCRCHi ^ *puchMsgg++ ;   
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;  
uchCRCLo = auchCRCLo[uIndex] ;  
}  
return (uchCRCHi << 8 | uchCRCLo) ;  

LRC(纵向冗余错误校验)  
LRC错误校验用于ASCII模式。这个错误校验是一个8位二进制数,可作为2个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行字符(LF)和置入的其他任何非ASCII十六进制字符在运算时忽略不计。LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。

LRC简单函数如下:  
static unsigned char LRC(auchMsg,usDataLen)  
unsigned char *auchMsg ;   
unsigned short usDataLen ;   
{ unsigned char uchLRC = 0 ;   
while (usDataLen--)   
uchLRC += *auchMsg++ ;   
return ((unsigned char)(-((char_uchLRC))) ;  
}

 
打赏
 
更多>同类编程
0相关评论

推荐图文
推荐编程
点击排行

网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报