纵向冗余校验计算方法_纵向冗余校验LRC CRC

http://www.cnblogs.com/zhangzhifeng/p/5579688.html

http://wenku.baidu.com/link?url=4uAVtSk0zxJYht7y51o7_e2Aa5mjykJogkeQDtBkFZQawkjjtCoLnhCAV7xwxEiNcuSn6OFAHLUZc_CisDO9isefhhY4keOyygFQD3Jodh_

#include

typedef unsigned char uchar;

typedef unsigned int uint;

uchar result;

uchar data[6];//={0x03,0x10,0x0b,0xe8, //0xff,0x00};

void main()

{

int LRC(uchar*data);

int a;

int b;

printf("输入要发送的数据。\n");

scanf("%x%x%x%x%x%x",&data[0],&data[1],&data[2],&data[3],&data[4], &data[5]);

a=LRC(data);

printf("校验码为:0x%x\n",a);

printf("输入接收到的数据\n");

scanf("%x%x%x%x%x%x%x",&data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&b);

if (b!=a)

{

printf("传送失败\n");

}

else

{

printf("传送成功\n");

}

getchar();

getchar();

}

1、LRC校验

LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。  LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。

它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它对应的代码:

BYTE GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码

{

BYTE byLrc = 0;

char pBuf[4];

int nData = 0;

for(i=1; i

{

//每两个需要发送的ASCII码转化为一个十六进制数

pBuf [0] = pSendBuf [i];

pBuf [1] = pSendBuf [i+1];

pBuf [2] = '\0';

sscanf(pBuf,"%x",& nData);

byLrc += nData;

}

byLrc = ~ byLrc;

byLrc ++; return byLrc;

}

2、CRC校验

CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收

到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值

进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。  CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值

相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。  CRC添加到消息中时,低字节先加入,然后高字节。下面是它对应的代码:

WORD GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码

{

WORD wCrc = WORD(0xFFFF);

for(int i=0; i

{

wCrc ^= WORD(BYTE(pSendBuf[i]));

for(int j=0; j<8; j++)

{

if(wCrc & 1)

{

wCrc >>= 1;

wCrc ^= 0xA001;

}

else

{

wCrc >>= 1;

}

}

}

return wCrc;

}

对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:

1、 把命令的CRC校验去掉,并且计算出LRC校验取代。

2、 把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。

3、 在命令的开头加上起始标记“:”,它的ASCII码为0x3A。

4、 在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。

掌握两种协议的编程方法,剩下的就是C语言的问题了。

ddr123456 2009-02-18 13:44

请问哪位高手知道LRC校验码计算方法,程序如何写(西门子S7-200与台达VFD-B变频器通信)?

ljc2008

2009-02-18 15:08

2.LRC校验码

这是MODBUS通讯协议ASCII方式的校验方法,LRC校验码不能直接用指令求出,但可编制程序自动算出,

算法:将参与校验的数据求和,取其低8位的补码为校验码

例:求数据 01H,03H,21H,02H,00H,02H 之求和校验码。

求和:01H + 03H + 21H + 02H + 00H + 02H = 29H 求补码有二种方法: ① 求反加1  ②  用FFH相减    我们下面用求反加一来做

0  0  1  0  1  0  0  1

求反: 1  1  0  1  0  1  1  0

加 1: 0  0  0  0  0  0  0  1

1  1  0  1  0  1  1  1

D             7

LRC校验码为:D7H

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2016-07-22 12:21

浏览 1266

评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了CRC(循环冗余校验)码,还有其他常用的校验码。以下是几种常见的校验码: 1. 奇偶校验码(Parity Check):奇偶校验是一种简单的校验方法,用于检测二进制数据中的错误。在奇偶校验中,每个字节(8位)都有一个附加的校验位。校验位的值取决于数据字节中1的个数,使得整个字节在传输过程中具有奇数或偶数个1。 2. 奇偶校验位扩展(Extended Parity Check):该方法是奇偶校验的扩展形式,用于检测和纠正错误。在奇偶校验位扩展中,除了奇偶校验位,还有附加的冗余位,用于检测并纠正单比特错误。 3. 循环冗余校验CRC)码:CRC码是一种广泛应用于数据通信的校验方法。它基于生成多项式的运算,在发送数据前将多项式除法运算的余数附加到数据末尾,接收端根据同样的多项式进行除法运算,如果余数为零,则数据没有错误,否则存在错误。 4. LRC校验码(Longitudinal Redundancy Check):LRC是一种纵向冗余校验方法,用于检测通信数据中的错误。它基于对每个字符的按位异或操作生成校验位,接收端对接收到的数据再次进行异或运算,如果结果为零,则数据没有错误。 5. 整除校验码(Division Check):整除校验是一种简单的检错校验方法,它通过对数据进行除法运算,并将余数作为校验位。在接收端,对接收到的数据再次进行除法运算,并比较余数与发送端生成的校验位是否相等,以确定数据是否正确。 这些校验方法都有其特点和适用范围,根据具体的通信需求和数据传输环境选择合适的校验方法可以提高数据的可靠性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值