发布于 2011-04-07 23:41:56
3楼
CP340,你自己可以写个CRC校验,那样就容易多了。
CRC校验算法:
1.预置16位寄存器为16进制FFFF,作为CRC寄存器;
2.把第一个字节与CRC寄存器的低位相异或,结果放在CRC寄存器;
3.把寄存器的内容右移一位,用0填补最高位,检查移出位;
4.如果移出位为0,重复第3步,如果最低位为1,CRC寄存器与多项式AOO1进行异或;
5.重复步骤3、4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2-5,进行下一个字节的处理;
7.最后得到的CRC寄存器即为CRC校验码;
我写过一个CRC校验,现场用没发现问题。楼主可以参考一下:
自定义一个FC:
参数如下:
IN:
DB_NO:INT,DB块
DBB_Start:INT,字节起始地址
DBB_Counts:INT,要校验的字节数
OUT:
CRC_H:BYTE;
CRC_L:BYTE;
TEMP:
CRC_REG:WORD;
DB_NO_TEMP:INT;
BytesChecked:INT;
BitsChecked:INT;
程序如下:
L W#16#FFFF
T #CRC_REG //预置CRC寄存器
L #DB_NO
T #DB_NO_TEMP
OPN DB [#DB_NO_TEMP]
L #DBB_Start //读入校验起始字节
SLD 3
LAR1
L #DBB_Counts //读入校验字节数量
_A: T #BytesChecked //字节处理循环
L DBB [AR1,P#0.0]
L LB 1
XOW
T LB 1
L 8
_B: T #BitsChecked //位处理循环
L #CRC_REG
SRW 1
T #CRC_REG
JZ _C //检验移出位是否为1
L #CRC_REG
L W#16#A001
XOW
T #CRC_REG
_C: L #BitsChecked //校验下个位
LOOP _B
+AR1 P#1.0 //校验下个字节
L #BytesChecked
LOOP _A
L LB 1 //输出校验码
T #CRC_H
L LB 0
T #CRC_L
业精于勤,行成于思