Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2849947
  • 博文数量: 523
  • 博客积分: 11908
  • 博客等级: 上将
  • 技术积分: 5475
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-03 15:50
文章分类

全部博文(523)

文章存档

2019年(3)

2013年(4)

2012年(71)

2011年(78)

2010年(57)

2009年(310)

分类: C/C++

2012-11-17 11:43:29

LRC:Longitudinal Redundancy Check,纵向冗余校验,简称LRC校验或纵向校验。 
下面以实例对这种校验方法做个说明。 
台达VFD-M系列变频器的Modbus ASCII通信模式採用LRC偵誤值。LRC偵誤值乃是將ADR1至最後一個資料內容加總,得到之結果以十进制的256為單位,超出之部分去除(例如得到之結果為十六進位之128H則只取28H(减去了100H,就是减去了256D)),然後計算二次反補後得到之結果即為LRC偵誤值。例如:從地址為01H之交流電機驅動器的0401H地址讀取1個字。 
STX ‘:’ 
ADR 1 ‘0’ 
ADR 0 ‘1’ 
CMD 1 ‘0’ 
CMD 0 ‘3’ 
啟始資料地址‘0’ 
‘4’ 
‘0’ 
‘1’ 
資料數 ‘0’ 
‘0’ 
‘0’ 
‘1’ 
LRC CHK 1 ‘F’ 
LRC CHK 0 ‘6’ 
END 1 CR 
END 0 LF 
01H+03H+04H+01H+00H+01H=0AH, 0AH的二次反補為F6H。 

二次反补:取反然后加1B或1H(1B=1H)。 
计算方法1: 
取反后加1B:把数据转换为二进制,每位取反后再加1B。例如:0AH=00001010B,按位取反后得 11110101B,11110101B+1B=11110110B=F6H,0AH的二次反补就是F6H。 
取反后加1H:把数据转换为二进制,每位取反后再加1H。例如:0AH=00001010B,按位取反后得 11110101B=F5H,F5H+1H=F6H,0AH的二次反补就是F6H。 

计算方法2: 
有个简单算法就是:这个十六进制值有几位数,就把高于这个位数的最小值减去这个值。如果16进制数有2位,那么高于2位的最小值就是100H,用100H 减去这个数就是其二次反补。 
实际上,该方法的原理和方法1相同:以2位16进制数为例,FFH减去那个数就是把那个数取反(FFH的数据为全1,减去那个数的结果就是原来1的位数变为0,原来0的位数变为1),而FFH+1H=100H。所以取反然后加一就等于100H减去这个数。 
例如:0AH的二次反补就是:100H-0AH=F6H
阅读(7444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~