MODBUS协议的CRC校验子程序代码
为方便读者使用MODBUS协议,将VC、VB、ASM51环境下MODBUS协议的CRC校验子程序代码一并给出,供读者参考。
//***CRC Calculation for MODBUS Protocol for VC ***//
//数组snd为地址等传输字节,num为字节数,发为6收为5//
unsigned int mb_crc(BYTE *snd,int num)
{ int i,j;
unsigned int c,crc=0xFFFF
for (i=0;i<num;i )
{ c=str[i] & 0x00FF;
crc^=c;
for(j=0,j<8,j )
{ if (crc & 0x0001)
{crc>>=1;crc^=0xA001;}
else crc>>=1
}
}
return(crc);
}
' //***CRC Calculation for MODBUS Protocol for VB***//
mb_crc(ByRef snd() as BYTE,num as integer) as Long
crc_l=crc_h=&HFF
for i=1 to num
crc_l=crc_l XOR snd(i)
for j=1 to 8
if crc_l AND 1 then
crc_l=(crc_l-1)/2
if crc_h and 1 then
crc_l=crc_l 128
crc_h=(crc_h-1)/2
end if
crc_l=crc_l XOR &HA0
crc_h=crc_h XOR &H01
else: crc_l=crc_l/2
if crc_h and 1 then
crcl_l=crc_l 128
crc_h=(crc_h-1)/2
else: crc_h=crc_h/2
end if
end if
next j
next i
mb_crc=crc_l crc_h*256
End
;CRC Calculation for MODBUS Protocol for ASM51
;R1 为发送(接收)字节的缓存首地址
;R2 为发送(接收)字节的字节数(不含CRC字节),
;R3 为CRC校验低位字节,
;R4 为CRC校验高位字节,
CRC: MOV A,#0FFH
MOV R4,A
MOV R3,A
CRC1: MOV A,@R1
XRL A,R3
MOV R3,A
MOV R2,#08H
CRC8: CLR C
MOV A,R4
RRC A
MOV R4,A
MOV A,R3
RRC A
MOV R3,A
JNC CRC10
MOV A,R3
XRL A,#01H
MOV R3,A
MOV A,R4
XRL A,#0A0H
MOV R4,A
CRC10: DJNZ R2,CRC8
INC R1
DJNZ CRC1
RET |