Modbus协议中CRC校验和LRC校验.docx

上传人:1513****116 文档编号:93456723 上传时间:2023-07-05 格式:DOCX 页数:6 大小:50.49KB
返回 下载 相关 举报
Modbus协议中CRC校验和LRC校验.docx_第1页
第1页 / 共6页
Modbus协议中CRC校验和LRC校验.docx_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《Modbus协议中CRC校验和LRC校验.docx》由会员分享,可在线阅读,更多相关《Modbus协议中CRC校验和LRC校验.docx(6页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 .CRC 的生成循环冗余校验(CRC) 域为两个字节,包含一个二进制16 位值。附加在报文后面的CRC 的值由发送设备计算。接收设备在接收报文时重计算CRC 的值,并将计算结果于实际接收到的CRC值相比较。假设两个值不相等,则为错误。CRC 的计算, 开头对一个16位存放器预装全1. 然后将报文中的连续的8位子节对其进展后续的计算。只有字符中的8个数据位参与生成CRC 的运算,起始位,停顿位和校验位不参与CRC 计算。CRC 的生成过程中, 每个 8位字符与存放器中的值异或。然后结果向最低有效位(LSB) 方向移动(Shift) 1位,而最高有效位(MSB) 位置充零。然后提取并检查LSB:

2、假设LSB 为1,则存放器中的值与一个固定的预置值异或;假设LSB 为 0,则不进展异或操作。这个过程将重复直到执行完8 次移位。完成最终一次第8 次移位及相关操作后,下一个8位字节与存放器的当前值异或,然后又同上面描述过的一样重复8 次。当全部报文中子节都运算之后得到的存放器中的最终值,就是CRC.生成CRC 的过程为:1. 将一个16 位存放器装入十六进制FFFF (全1). 将之称作CRC 存放器.2. 将报文的第一个8位字节与16 位CRC 存放器的低字节异或,结果置于CRC 存放器.3. 将CRC 存放器右移1位(向LSB 方向), MSB 充零. 提取并检测LSB.4. (假设LS

3、B 为0): 重复步骤3 (另一次移位).(假设LSB 为1): 对CRC 存放器异或多项式值0xA001 (1010 0000 0000 0001).5. 重复步骤3 和 4,直到完成8 次移位。当做完此操作后,将完成对8位字节的完整操作。6. 对报文中的下一个字节重复步骤2 到5,连续此操作直至全部报文被处理完毕。7. CRC 存放器中的最终内容为CRC 值.8. 当放置 CRC 值于报文时,如下面描述的那样,凹凸字节必需交换。MODBUS 协议的 CRC 校验子程序代码为便利读者使用MODBUS协议,将VC、VB、ASM51环境下MODBUS协议的CRC校验子程序代码一并给出,供读者参考

4、。/*CRC Calculation for MODBUS Protocol for VC */数组 snd 为地址等传输字节,num 为字节数,发为 6 收为 5/ unsigned int mb_crc(BYTE *snd,int num)int i,j;unsigned int c,crc=0xFFFF for (i=0;inum;i )c=sndi & 0x00FF; crc=c; for(j=0,j=1; crc=0xA001;elsecrc=1return(crc);unsigned short int CrcCheck(const unsigned char * buffer,

5、const int buffLen)unsigned short int crcValue = 0;if (!buffer | buffLen 0)return crcValue;int CRCHi = 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0,0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1,0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80,

6、 0x41, 0x0, 0xC1, 0x81,0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40,0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1,0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0,0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41

7、, 0x1, 0xC0, 0x80,0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41,0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0,0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0,0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1

8、, 0xC0, 0x80,0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41,0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x1,0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1,0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC

9、1, 0x81,0x40, 0x1, 0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40,0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1, 0x81, 0x40, 0x1,0xC0, 0x80, 0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x0, 0xC1,0x81, 0x40, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40, 0x1, 0xC0, 0x

10、80,0x41, 0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40;int CRCLo = 0x0, 0xC0, 0xC1, 0x1, 0xC3, 0x3, 0x2, 0xC2, 0xC6, 0x6, 0x7, 0xC7, 0x5,0xC5, 0xC4, 0x4, 0xCC, 0xC, 0xD, 0xCD, 0xF, 0xCF, 0xCE, 0xE, 0xA, 0xCA,0xCB, 0xB, 0xC9, 0x9, 0x8, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB,0xDA, 0x1A, 0x1E, 0xDE, 0

11、xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14,0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11,0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36,0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF,0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39,

12、 0xF9, 0xF8, 0x38, 0x28,0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D,0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22,0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63,0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA

13、4, 0x6C,0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x

14、91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87,

15、0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80, 0x40;int i, m;int dCRCHi = 0xFF; int dCRCLo = 0xFF;for (i = 0; i buffLen; i+)m = dCRCLo bufferi; dCRCLo = dCRCHi CRCHim; dCRCHi = CRCLom;crcValue = dCRCLo + (dCRCHi 8);return crcValue;” /*CRC Calculation for MODBUS Protocol for VB*/Function

16、mb_crc(ByRef snd as BYTE,num as integer) as Long crc_l=crc_h=&HFFfor i=1 to num crc_l=crc_l XOR snd(i) for j=1 to 8if crc_l AND 1 then crc_l=(crc_l1)/2 if crc_h and 1 then crc_l=crc_l 128 crc_h=(crc_h1)/2 end ifcrc_l=crc_l XOR &HA0 crc_h=crc_h XOR &H01 else: crc_l=crc_l/2if crc_h and 1 then crcl_l=c

17、rc_l 128 crc_h=(crc_h1)/2 else: crc_h=crc_h/2 end ifend if next j next imb_crc=crc_l crc_h*256 End Function;CRC Calculation for MODBUS Protocol for ASM51;R1 为发送接收字节的缓存首地址;R2 为发送接收字节的字节数不含CRC 字节,;R3 为 CRC 校验低位字节,;R4 为 CRC 校验高位字节,CRC: MOV A,#0FFH MOV R4,AMOV R3,ACRC1: MOV A,R1 XRL A,R3MOV R3,A MOV R2,

18、#08H CRC8: CLR C MOV A,R4 RRC AMOV R4,A MOV A,R3 RRC A MOV R3,AJNC CRC10 MOV A,R3 XRL A,#01H MOV R3,A MOV A,R4 XRL A,#0A0H MOV R4,ACRC10: DJNZ R2,CRC8 INC R1DJNZ CRC1 RETLRC 的生成纵向冗余校验(LRC)为一个字节,含有8 位二进制值。LRC 由发送设备计算,并附加LRC 到报文。接收设备在接收文时计算LRC, 并将计算的结果与在LRC 接收到的实际值相比较,假设两个值不相等,则结果为错。LRC 的计算, 对报文中的全部的连

19、续8 位字节相加,无视任何进位,然后求出其二进制补码。LRC 为一个8 位域,那么每个会导致值大于255的相加只是简洁的将域的值在零” 缭绕”。由于没有第9 位,进位被自动放弃。生成一个LRC 的过程为:1. 不包括起始”冒号”和完毕CRLF 的报文中的全部字节相加到一个8位域,故此进位被丢弃。2. 从FF (全1)十六进制中减去域的最终值,产生1 的补码(二进制反码)。3. 加1 产生二进制补码.将 LRC 置于报文当8 位LRC (2 个 ASCII 字符) 在报文中传送时,高位字符首先发送,然后是低位字符。例如,假设LRC 值为十六进制61 (0110 0001):例: 下面给出了执行生

20、成LRC 的C 语言函数。函数带有两个参数:unsigned char *auchMsg; 指向含有用于生成LRC 的二进制数据报文缓冲区的指针, unsigned short usDataLen; 报文缓冲区的字节数.LRC 生成函数static unsigned char LRC(auchMsg, usDataLen) /* 函数返回unsigned char 类型的LRC 结果*/unsigned char *auchMsg ; /* 要计算LRC 的报文*/unsigned short usDataLen ; /* 报文的字节数*/unsigned char uchLRC = 0 ; /* LRC 初始化*/ while (usDataLen-) /* 完成整个报文缓冲区*/uchLRC += *auchMsg+ ; /* 缓冲区字节相加,无进位*/ return (unsigned char)(-(char)uchLRC) ; /* 返回二进制补码*/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com