老帖中發(fā)現(xiàn)的一個crc校驗,帖子說是正確的,可我感覺在第一個for循環(huán),ac1在怎么加一,永遠(yuǎn)都是將&vb0的數(shù)據(jù)送給它啊,是我理解錯誤,還是程序有錯誤?怎么修改才好呢?
network1//網(wǎng)絡(luò)標(biāo)題
//網(wǎng)絡(luò)注釋
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協(xié)議給的crc校驗算法。
crc開始時先把寄存器的16位全部置成“1”,然后把相鄰2個8位字節(jié)的數(shù)據(jù)放入當(dāng)前寄存器中,只有每個字符的8位數(shù)據(jù)用作產(chǎn)生crc,起始位,停止位和奇偶校驗位不加到crc中。產(chǎn)生crc期間,每8位數(shù)據(jù)與寄存器中值進(jìn)行異或運算,其結(jié)果向右移一位(向lsb方向),并用“0”填入msb,檢測lsb,若lsb為“1”則與預(yù)置的固定值異或,若lsb為“0”則不作異或運算。重復(fù)上述處過程,直至移位8次,完成第8次移位后,下一個8位數(shù)據(jù),與該寄存器的當(dāng)前值異或,在所有信息處理完后,寄存器中的最終值為crc值。
產(chǎn)生crc的過程:
1.把16位crc寄存器置成ffffh.
2.第一個8位數(shù)據(jù)與crc寄存器低8位進(jìn)行異或運算,把結(jié)果放入crc寄存器。
3.crc寄存器向右移一位,msb填零,檢查lsb.
4.(若lsb為0):重復(fù)3,再右移一位。
(若lsb為1):crc寄存器與aoolh進(jìn)行異或運算
5.重復(fù)3和4直至完成8次移位,完成8位字節(jié)的處理。
6.重復(fù)2至5步,處理下一個8位數(shù)據(jù),直至全部字節(jié)處理完畢。
7.crc寄存器的最終值為crc值。
8.把crc值放入信息時,高8位和低8位應(yīng)分開放置。
把crc值放入信息中,發(fā)送信息中的16位crc值時,先送低8位,后送高8位。