技术论坛

 回复:贴一段CRC校验程序,请看看哪里有错误?

返回主题列表
作者 主题
妍妍
游士

经验值:261
发帖数:149
精华帖:0
楼主    2009-12-15 21:22:27
主题:贴一段CRC校验程序,请看看哪里有错误?
将论坛里“学生在此”用户贴出的程序做了一些改动,用逐位法计算CRC,同样的程序在单片机里计算出来的CRC校验码跟PLC计算出的不一样,用网上下载的CRC校验软件得出的结果与单片机运行结果一样,不知道哪里出错了,希望大家指点指点!G(X)简记为1021.
FUNCTION_BLOCK "WCRC_FB"

TITLE =

VERSION : 0.1
VAR_INPUT

db_no : INT ;

dbb_no : INT ;

byte_len : INT ;

END_VAR

VAR_OUTPUT

wcrc : WORD ;

END_VAR

VAR

old_wcrc : WORD ;

c : BYTE ;

j : INT ;

END_VAR

VAR_TEMP
db_no1 : INT ;
END_VAR

BEGIN

NETWORK

TITLE =
L #db_no
T #db_no1
OPN DB [#db_no1]
// 发送指令的起始字节放在指针AR1中
L #dbb_no
LAR1
//初始化old_wcrc=0xffff;
L W#16#FFFF
T #old_wcrc
// 进入大循环,byte_len:需要计算CRC的字节个数
loop: L #byte_len
L 0
<=I
JC end
//c:字节
L DBB [AR1,P#0.0]
T #c
//字节与crc寄存器异或
L #old_wcrc
L #c
XOW
T #old_wcrc
//j:位个数
L 0
T #j
//判断一个字节是否计算完,j是否为8
a: L #j
L 8
>=I
JC b
//得到lsb位
L #old_wcrc
L W#16#1
AW
//判断lsb,为1:右移一位;为0:右移一位与1021异或。位指针加1
JZ c
L #old_wcrc
SRW 1
L W#16#1021
XOW
T #old_wcrc
c: L #old_wcrc
SRW 1
T #old_wcrc

L 1
L #j
+I
T #j
JU a
b: L -1
L #byte_len
+I
T #byte_len
//指向下一个字节
+AR1 P#1.0
//输出最终的CRC值
JU loop
end: L #old_wcrc
T #wcrc
BE
END_FUNCTION_BLOCK
dcount107
侠圣

经验值:2840
发帖数:1737
精华帖:55
3楼    2009-12-16 11:03:48
精华帖  主题:回复:贴一段CRC校验程序,请看看哪里有错误?
在判断lsb位的时候犯了一个小小的错误,呵呵

//得到lsb位
L #old_wcrc
L W#16#1
AW
//判断lsb,为1:右移一位;为0:右移一位与1021异或。位指针加1
JZ c
L #old_wcrc
SRW 1
L W#16#1021
XOW
T #old_wcrc
ju d
c: L #old_wcrc
SRW 1
T #old_wcrc
d: nop 0
非淡泊无以明志,非宁静无以致远
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。