﻿{"id":774,"date":"2012-06-08T10:39:55","date_gmt":"2012-06-08T02:39:55","guid":{"rendered":"http:\/\/www.tansoo.cn\/?p=774"},"modified":"2014-12-29T10:59:18","modified_gmt":"2014-12-29T02:59:18","slug":"modbus%e5%8d%8f%e8%ae%aecrc%e7%9a%84%e4%b8%a4%e7%a7%8d%e7%ae%97%e6%b3%95%e6%ba%90%e7%a0%81","status":"publish","type":"post","link":"http:\/\/www.tansoo.cn\/?p=774","title":{"rendered":"Modbus\u534f\u8baeCRC\u7684\u4e24\u79cd\u7b97\u6cd5\u6e90\u7801"},"content":{"rendered":"<p>Modbus\u534f\u8baeCRC\u7684\u4e24\u79cdDelphi\u7b97\u6cd5\u6e90\u7801\u4e3e\u4f8b\u3002\u5728\u5de5\u63a7\u5f00\u53d1\u65f6\u7ecf\u5e38\u7528\u5230. <!--more--><\/p>\n<pre class=\"lang:delphi decode:true \" >unit Unit1;     \r\n\r\ninterface     \r\n\r\nuses     \r\n  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;     \r\n\r\ntype     \r\n  TDataByte = array of byte;     \r\n\r\n  TForm1 = class(TForm)     \r\n    Button1: TButton;     \r\n    Edit1: TEdit;     \r\n    Label1: TLabel;     \r\n    Edit2: TEdit;     \r\n    procedure Button1Click(Sender: TObject);     \r\n  private     \r\n    { Private declarations }     \r\n  public     \r\n    { Public declarations }     \r\n  end;     \r\n\r\nconst     \r\n  CRCHi: array [0..255] of byte =     \r\n(     \r\n$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00,     \r\n$C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1,     \r\n$81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81,     \r\n$40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40,     \r\n$01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01,     \r\n$C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0,     \r\n$80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80,     \r\n$41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,     \r\n$01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00,     \r\n$C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,     \r\n$80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80,     \r\n$41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41,     \r\n$00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01,     \r\n$C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1,     \r\n$81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81,     \r\n$40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,     \r\n$01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01,     \r\n$C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1,     \r\n$81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80,     \r\n$41, $01, $C0, $80, $41, $00, $C1, $81, $40     \r\n) ;     \r\n\r\nCRCLo: array [0..255] of  byte =     \r\n(     \r\n$00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06, $07, $C7, $05,     \r\n$C5, $C4, $04, $CC, $0C, $0D, $CD, $0F, $CF, $CE, $0E, $0A, $CA,     \r\n$CB, $0B, $C9, $09, $08, $C8, $D8, $18, $19, $D9, $1B, $DB, $DA,     \r\n$1A, $1E, $DE, $DF, $1F, $DD, $1D, $1C, $DC, $14, $D4, $D5, $15,     \r\n$D7, $17, $16, $D6, $D2, $12, $13, $D3, $11, $D1, $D0, $10, $F0,     \r\n$30, $31, $F1, $33, $F3, $F2, $32, $36, $F6, $F7, $37, $F5, $35,     \r\n$34, $F4, $3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A, $3B,     \r\n$FB, $39, $F9, $F8, $38, $28, $E8, $E9, $29, $EB, $2B, $2A, $EA,     \r\n$EE, $2E, $2F, $EF, $2D, $ED, $EC, $2C, $E4, $24, $25, $E5, $27,     \r\n$E7, $E6, $26, $22, $E2, $E3, $23, $E1, $21, $20, $E0, $A0, $60,     \r\n$61, $A1, $63, $A3, $A2, $62, $66, $A6, $A7, $67, $A5, $65, $64,     \r\n$A4, $6C, $AC, $AD, $6D, $AF, $6F, $6E, $AE, $AA, $6A, $6B, $AB,     \r\n$69, $A9, $A8, $68, $78, $B8, $B9, $79, $BB, $7B, $7A, $BA, $BE,     \r\n$7E, $7F, $BF, $7D, $BD, $BC, $7C, $B4, $74, $75, $B5, $77, $B7,     \r\n$B6, $76, $72, $B2, $B3, $73, $B1, $71, $70, $B0, $50, $90, $91,     \r\n$51, $93, $53, $52, $92, $96, $56, $57, $97, $55, $95, $94, $54,     \r\n$9C, $5C, $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B, $99,     \r\n$59, $58, $98, $88, $48, $49, $89, $4B, $8B, $8A, $4A, $4E, $8E,     \r\n$8F, $4F, $8D, $4D, $4C, $8C, $44, $84, $85, $45, $87, $47, $46,     \r\n$86, $82, $42, $43, $83, $41, $81, $80, $40     \r\n);     \r\n\r\nvar     \r\n  Form1: TForm1;     \r\n\r\nimplementation     \r\n\r\n{$R *.dfm}     \r\n\r\nfunction crc16(var dataaddress :byte; datalength: byte): word;     \r\nvar     \r\n  hi: byte;     \r\n  lo: byte;     \r\n  i: byte;     \r\n  index: byte;     \r\n  datadd: pbytearray;     \r\nbegin     \r\n  hi := $FF;     \r\n  lo := $FF;     \r\n  datadd := @dataaddress;     \r\n  i := 0;     \r\n  while (datalength &gt; 0) do     \r\n  begin     \r\n    index := hi xor datadd^[i];     \r\n    i := i + 1;     \r\n    hi := lo xor crchi[index];     \r\n    lo := crclo[index];     \r\n   datalength := datalength - 1;     \r\n  end;     \r\n  crc16 := hi shl 8 or lo;     \r\nend;     \r\n\r\nfunction ModBusCRC(Data: string): string; \/\/\u751f\u6210modbus CRC\u6570\u636e     \r\nvar     \r\n  CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: Dword;     \r\n  i, index: integer;     \r\nbegin     \r\n  CRC16Lo := $FF; \/\/CRC16Lo\u4e3aCRC\u5bc4\u5b58\u5668\u4f4e8\u4f4d     \r\n  CRC16Hi := $FF; \/\/CRC16Hi\u4e3aCRC\u5bc4\u5b58\u5668\u9ad88\u4f4d     \r\n  CL := $01;     \r\n  CH := $A0; \/\/  A001 H \u662fCRC\uff0d16\u591a\u9879\u5f0f\u4ee3\u7801     \r\n  for i := 1 to Length(Data) do     \r\n  begin     \r\n    CRC16Lo := CRC16Lo xor ord(Data[i]); \/\/\u6bcf\u4e00\u4e2a\u6570\u636e\u4e0eCRC\u5bc4\u5b58\u5668\u5f02\u6216     \r\n    for index := 0 to 7 do     \r\n    begin     \r\n      UseHi := CRC16Hi;     \r\n      UseLo := CRC16Lo;     \r\n      CRC16Hi := CRC16Hi shr 1;     \r\n      CRC16Lo := CRC16Lo shr 1; \/\/\u53f3\u79fb\u4e00\u4f4d     \r\n      if ((UseHi and $1) = $1) then \/\/\u5982\u679c\u9ad8\u4f4d\u5b57\u8282\u6700\u540e\u4e00\u4f4d\u662f1\u7684\u8bdd     \r\n        CRC16Lo := CRC16Lo or $80; \/\/\u4f4e\u4f4d\u5b57\u8282\u53f3\u79fb\u540e\u524d\u9762\u88651     \r\n\r\n      if ((UseLo and $1) = $1) then \/\/\u5982\u679cLSB \u4e3a1\uff0c\u5219\u4e0e\u591a\u9879\u5f0f\u8fdb\u884c\u5f02\u6216     \r\n      begin     \r\n        CRC16Hi := CRC16Hi xor CH;     \r\n        CRC16Lo := CRC16Lo xor CL;     \r\n      end;     \r\n    end;     \r\n  end;     \r\n\r\n  Result := IntToHex(CRC16Lo, 2) + IntToHex(CRC16Hi, 2);     \r\nend;     \r\n\r\nprocedure TForm1.Button1Click(Sender: TObject);     \r\nvar     \r\n  Data1 : TDataByte;     \r\n  c:word;     \r\n  i,l:integer;     \r\nbegin     \r\n  l := Length(Edit1.Text);     \r\n  Setlength(Data1,l);     \r\n  for i:=0 to l-1 do     \r\n    Data1[i]:= ord(Edit1.Text[i+1]);     \r\n\r\n  c:=CRC16(Data1[0],l);     \r\n  Edit2.Text:=('ModBusCRC='+ModBusCRC(Edit1.Text)+'     CRC16='+ inttohex(c,4));     \r\nend;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Modbus\u534f\u8baeCRC\u7684\u4e24\u79cdDelphi\u7b97\u6cd5\u6e90\u7801\u4e3e\u4f8b\u3002\u5728\u5de5\u63a7\u5f00\u53d1\u65f6\u7ecf\u5e38\u7528\u5230.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[15,14,32],"class_list":["post-774","post","type-post","status-publish","format-standard","hentry","category-program","tag-crc","tag-delphi","tag-modbus"],"_links":{"self":[{"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=\/wp\/v2\/posts\/774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=774"}],"version-history":[{"count":0,"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=\/wp\/v2\/posts\/774\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=774"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tansoo.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}