求CRC16源代码 ( 积分: 200 )

  • 主题发起人 主题发起人 wwdelphi
  • 开始时间 开始时间
W

wwdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:希望求得6字节,16进制数据信息的CRC16校验码,比如:
“01 06 01 21 00 02”的CRC16校验码?
“01 03 00 00 00 02”的CRC16校验码?
“01 06 00 9F 00 C8”的CRC16校验码?
用于modbus通讯协议。
-------------------------
小弟在网上寻觅CRC16的源代码许久,均空手而回;
兄弟们谁有CRC16的“源代码”,借小弟用用吧;
谢谢了[8D]
如果可以使用,另开帖加300分。
可以发到我的邮箱
wangxinquan@tju.edu.cn
 
unit unCRC16_Modbus;

interface

function CalCRC16(AData:array of Byte; AStart,AEnd:Integer): Word;

implementation

function CalCRC16(AData:array of Byte; AStart,AEnd:Integer): Word;
const
GENP = $A001;

var
crc:Word;
i:Integer;
tmp:Byte;

procedure CalOneByte(AByte:Byte);
var
j:Integer;
begin
crc:=crc xor AByte;
for j := 0 to 7 do
begin
tmp:=crc and 1;
crc:=crc shr 1;
crc:= crc and $7FFF;
if tmp = 1 then
crc:= crc xor GENP;
crc:=crc and $FFFF;
end;
end;

begin
crc:=$FFFF;
for i := AStart to AEnd do
CalOneByte(AData);
Result:=crc;
end;

end.
 
这个是我现在用的,与西门子PLC通信(MODBUS),可以用的。
还有一种查表法,对于现在的电脑,用不着了。。。。
 
谢谢兄弟,我试试先。
 
janker:
对于函数function CalCRC16(AData:array of Byte; AStart,AEnd:Integer): Word;
如果我想将数据信息:[red]01 06 01 21 00 02[/red]从edit1输入,通过函数CalCRC16计算,得到CRC校验码,应该如何输入呢?
这样对吗:CalCRC16(Adata[0]:=edit1.text;Adata[1]:=edit2.text;Adata[2]:=edit3.text;Adata[3]:=edit4.text;Adata[4]:=edit5.text;Adata[5]:=edit6.text;Adata[1]:=edit1.text;0,5);
运行这个函数之后,令edit7.text=crc就可以直接得到CRC校验码了,不知道这样理解对吗?小弟不是软件专业,所以问题很幼稚,见笑见笑。
 
呵呵,不能这样。如何输入数据,随便找本入门书就知道了。
AData是个源数组,一般通信中不是所有字节都参与CRC计算的。举个例:
var
b:array [0..19] of byte;
c:Word;
begin
b[0]:=$XX;
b[1]:=$XX;
b[2]:=$01;
b[3]:=$06;
b[4]:=$01;
b[5]:=$21;
b[6]:=$00;
b[7]:=$02;
b[8]:=$XX;
....
b[19]:=$XX;
//这里XX是随便一个数
c:=CalCRC16(b,2,7)
end;
 
哦,谢谢啊,我再试试,呵呵
 
谢谢janker大哥,我明白了!
还有个问题,是这样的,我要先算出CRC,然后与前面的 01 06 01 21 00 02一起传到下位机,怎么样将word型转换为byte呢?
另外,如果我想看看,c到底等于多少,比如edit1.text:=c;编译提示说word和string类型不匹配,是不是有函数将word变为string啊?
[:)]
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3794497

我的 CRC16 筆記
 
谢谢janker大哥,我已经将程序调好了![:)]
 
后退
顶部