紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2954|回复: 0

[MODBUS] Modbus(CRC)校验例程

[复制链接]
冰糖 发表于 2011-1-19 22:34:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
VB:
Public Function CrcResult(ByVal Data As Long, ByVal Genpoly As Long, ByVal CrcData As Long) As Long
Dim TmpI As Integer
Data = Data * 2
For TmpI = 8 To 1 Step -1
Data = Fix(Data / 2)

If ((Data Xor CrcData) And 1) Then
CrcData = Fix(CrcData / 2) Xor Genpoly
Else
CrcData = Fix(CrcData / 2)
End If

Next TmpI
CrcResult = CrcData
End Function
 
//函数应用方法
Dim fx(7)
Dim crc As Long
fx(0) = Val(Text2.Text)
fx(1) = &H3
fx(2) = &H0
fx(4) = &H0
fx(5) = &H1
fx(3) = MDI.Combo3.ListIndex
crc = &HFFFF&
For TmpI = 0 To 5
crc = CrcResult(CLng(fx(TmpI)), &HA001&, crc)
Next
fx(6) = CByte(crc And &HFF&) ‘得到的校验高位
fx(7) = CByte(Fix(crc / 256) And &HFF&) ‘得到的校验低位
 
 
 
 
 
 
 
 
 
 
VC:
LONG myfunc::crc(LONG Data,LONG Genpoly,LONG CrcData)
{ INT TmpI;
Data = Data * 2;
for(TmpI = 8;TmpI>=1;TmpI--)
{
Data = int(Data / 2);
if ((Data ^ CrcData) & 1)
CrcData = int(CrcData / 2) ^ Genpoly;
else
CrcData = int(CrcData / 2);
}
return CrcData;
}
//函数应用方法
long crc;
UCHAR buf[8]={0xef,0x3,0x0,0x0,0x0,0x1,0x0,0x0};
buf[0]=add;
buf[2]=cmd & 0xff00;
buf[3]=cmd & 0xff;
crc = 0xFFFF;
for (i=0;i<6;i++)
{
crc = func.crc((long)buf, 0xA001,crc);
}
buf[6]=(BYTE)(crc & 0xFF);
buf[7] =(BYTE)(int(crc / 256) & 0xFF);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-5-2 07:14 , Processed in 0.343752 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表