水电电工知识
电工知识|RTU协议给的CRC校验算法
2016-02-15  浏览:62
水电之家讯:老帖中发现的一个CRC校验,帖子说是正确的,可我感觉在第一个FOR循环,AC1在怎么加一,永远都是将&VB0的数据送给它啊,是我理解错误,还是程序有错误?怎么修改才好呢?

Network1//网络标题

//网络注释

LDSM0.1



MOVB16#1,VB0



MOVB16#1,VB1



MOVB16#0,VB2



MOVB16#20,VB3



MOVB16#0,VB4



MOVB16#20,VB5

Network2

LDM0.1



FORVW10,+1,+6

Network3

LDW=VW10,+1



MOVW16#FFFF,AC0



MOVD&VB0,AC1

Network4

LDSM0.0



XORB*AC1,AC0

Network5

LDSM0.0



FORVW12,+1,+8



SRWAC0,1



AENO



ASM1.1



XORW16#A001,AC0

Network6

NEXT

Network7

LDSM0.0



INCDAC1

Network8

NEXT

Network9

LDM0.1



SWAPAC0



AENO



MOVWAC0,VW6

答:程序没问题,CRC本身的校验机制要清楚。请参考RTU协议给的CRC校验算法。

CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。产生CRC期间,每8位数据与寄存器中值进行异或运算,其结果向右移一位(向LSB方向),并用“0”填入MSB,检测LSB,若LSB为“1”则与预置的固定值异或,若LSB为“0”则不作异或运算。重复上述处过程,直至移位8次,完成第8次移位后,下一个8位数据,与该寄存器的当前值异或,在所有信息处理完后,寄存器中的最终值为CRC值。

产生CRC的过程:

1.把16位CRC寄存器置成FFFFH.

2.第一个8位数据与CRC寄存器低8位进行异或运算,把结果放入CRC寄存器。

3.CRC寄存器向右移一位,MSB填零,检查LSB.

4.(若LSB为0):重复3,再右移一位。

(若LSB为1):CRC寄存器与AoolH进行异或运算

5.重复3和4直至完成8次移位,完成8位字节的处理。

6.重复2至5步,处理下一个8位数据,直至全部字节处理完毕。

7.CRC寄存器的最终值为CRC值。

8.把CRC值放入信息时,高8位和低8位应分开放置。

把CRC值放入信息中,发送信息中的16位CRC值时,先送低8位,后送高8位。

水电之家为您提供最全面的管材,管件,水电,电线,电工,管材水电品牌的装修知识点和各种管材水电的导购与在线购买服务,拥有最便宜的管材水电价格和最优质的售后服务,每天都有秒杀的抢购活动哦!敬请登陆水电之家:http://shuidian.jc68.com/
更多»您可能感兴趣的文章:
更多»有关 电线 的产品:
  • 水电电工资讯
  • 发表评论 | 0评
  • 评论登陆
  • 移动社区 天花之家 木门之家 灯具之家 铁艺之家 幕墙之家 五金头条 楼梯头条 墙纸头条 壁纸头条 玻璃头条 老姚之家 灯饰之家 电气之家 全景头条 照明之家 防水之家 防盗之家 区快洞察 建材 枣庄建材 临沂建材 南昌建材 上饶建材 抚州建材 宜春建材 吉安建材 赣州建材 鹰潭建材 新余建材 九江建材 萍乡建材 景德镇陶瓷 石家庄建材 衡水建材 廊坊建材 沧州建材 承德建材 建材之家 企业之家 720全景
    (c)2015-2017 BYBC.CN SYSTEM All Rights Reserved