关于利用是RS232,ModBus协议中的CRC效验程序.请高人给思路和程序!(可以加分)

pomiox 2008-05-04 05:48:55
关于利用是RS232,ModBus协议中的CRC效验程序.请高人给思路和程序!谢谢,主要是是上位机和下位机(PLC)通讯
...全文
269 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaowei_001 2008-09-19
  • 打赏
  • 举报
回复
楼主还需要的话,加我Q吧。272324946
lyguo 2008-09-18
  • 打赏
  • 举报
回复
RS232,ModBus协议

下一段可能会用到,呵呵,关注一下,帮你顶
oosmile 2008-09-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080730/10/043ec015-923e-4aad-9ff0-a42fe31ddc5d.html

仪表通讯协议(MODBUS RTU)
http://www.metersnet.com/download/modbus.pdf

2.错误校验
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。
CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。
计算CRC码的步骤为:
1) 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
2) 把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
3) 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
4) 如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5) 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6) 重复步骤2到步骤5,进行下一个8位数据的处理;
7) 最后得到的CRC寄存器即为CRC码。

(二)、CRC校验码计算
UINT crc
void calccrc(BYTE crcbuf)
{
BYTE i;
crc=crc ^ crcbuf;
for(i=0;i <8;i++)
{
BYTE TT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if (TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}


delphi代码

function crc16(s: string; len: integer): string;
var
flag, c, crc: word;
i, j: integer;
begin
crc := $FFFF;
for i := 1 to (len div 2) do
begin
c := strtoint('$' + copy(s, (2 * i - 1), 2)); //16进制转10进制,每两位
crc := crc xor c;
for j := 1 to 8 do
begin
flag := crc and 1;
crc := crc shr 1;
if flag = 1 then crc := crc xor $A001;
end;
end;
result := IntToHex(crc, 2);
end;
liwengen 2008-09-16
  • 打赏
  • 举报
回复
VB得程序

Private Function CrcResult(ByVal Data As Long, ByVal Genpoly As Long, ByVal CrcData As Long) As Long
Dim n As Integer
Data = Data * 2
For n = 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 n
CrcResult = CrcData
End Function
pomiox 2008-05-05
  • 打赏
  • 举报
回复
没人开发过么?
zhangA 2008-05-05
  • 打赏
  • 举报
回复
http://www.cnblogs.com/goodmor9/archive/2006/08/03/466468.html

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧