å¨å·¥ä¸æ§å¶ä¸ï¼Modbus RTU CRC16çæ ¡éªç ç¨çæ¯è¾å¹¿æ³ï¼å
æ¬æ¬äººå¯å£«äº§åä¸ï¼PCä¸ä¼ºæçµæºä»¥åPCä¸VPç³»åçåé¢å¨çModbus RTUé讯ä¸é½ä½¿ç¨å°äºCRC16.
è对CRC16ç计ç®çæ¹å¼åºæ¬ä¸æ2ç§ï¼ç¬¬ä¸ç§ï¼ä½¿ç¨å循ç¯ä¾ç
§CRCç计ç®æ¹æ³è¿è¡è®¡ç®ï¼ç¬¬äºç§ï¼éç¨æ¥è¡¨çæ¹å¼ãæ¬äººæéæ æ¯ï¼ä»ç½ç»ä¸ææ¥çæ¥è¡¨æ³é½ä¸å®é
çæ£ç¡®CRC16çç»æææå·®å¼ï¼å æ¤ç¼åäºä¸ä¸ªå°ç¨åºä¾èªå·±ä½¿ç¨ã
软件ççé¢å¾ç®åï¼è¾å
¥è¯¸å¦â010303020014âçå¼ï¼ç¶åæ¯2个å符ä½ä¸ºä¸ä¸ªåèï¼å¡«å
¥åèæ°ï¼ç¶åå°±å¯ä»¥è®¡ç®åºæ ¡éªç ï¼æ ¡éªç çå¤é¡¹å¼ä¸ºï¼X16+X15+X2+1.
ç¨åºçé¢å¦ä¸ï¼
å®ç°çæºä»£ç å¦ä¸ï¼
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
Label4: TLabel;
function CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ
// CalCRC16ç¨äºè®¡ç®Modbus RTUçCRC16
// å¤é¡¹å¼å
¬å¼ä¸ºX16+X15+X2+1
//ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ
function TForm1.CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;
const
GENP=$A001; //å¤é¡¹å¼å
¬å¼X16+X15+X2+1ï¼1100 0000 0000 0101ï¼
var
crc:Word;
i:Integer;
tmp:Byte;
procedure CalOneByte(AByte:Byte); //计ç®1个åèçæ ¡éªç
var
j:Integer;
begin
crc:=crc xor AByte; //å°æ°æ®ä¸CRCå¯åå¨çä½8ä½è¿è¡å¼æ
for j:=0 to 7 do //对æ¯ä¸ä½è¿è¡æ ¡éª
begin
tmp:=crc and 1; //ååºæä½ä½
crc:=crc shr 1; //å¯åå¨åå³ç§»ä¸ä½
crc:=crc and $7FFF; //å°æé«ä½ç½®0
if tmp=1 then //æ£æµç§»åºçä½ï¼å¦æ为1ï¼é£ä¹ä¸å¤é¡¹å¼å¼æ
crc:=crc xor GENP;
crc:=crc and $FFFF;
end;
end;
begin
crc:=$FFFF; //å°ä½æ°è®¾å®ä¸ºFFFF
for i:=AStart to AEnd do //对æ¯ä¸ä¸ªåèè¿è¡æ ¡éª
CalOneByte(AData[i]);
Result:=crc;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Data:array[0..255] of Byte;
i,j,Count:Integer;
Res:Word;
szData:string;
begin
szData:=Form1.Edit2.Text; //读å
¥æ¬²æ ¡éªçå符串
Count:=StrToInt(form1.Edit3.Text); //读å
¥éè¦è®¡ç®çå符串é¿åº¦
i:=1;
j:=0;
for j:=0 to Count-1 do
begin
if (i mod 2)=0 then //æ¯2个å符æ¾å
¥ä¸ä¸ªåèä¸
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //ååºå符并转æ¢ä¸º16è¿å¶æ°
i:=i+1;
end;
Res:=CalCRC16(Data,Low(Data),Count-1);
form1.Edit1.Text:=IntToHex(Res,4);
end;
end.
温馨提示:答案为网友推荐,仅供参考