📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
SpeedButton1: TSpeedButton;
Label3: TLabel;
Label4: TLabel;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function ModBusCRC(Data: string): string; //生成modbus CRC数据
var
Form1: TForm1;
implementation
{$R *.dfm}
function ModBusCRC(Data: string): string; //生成modbus CRC数据
var
CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: Dword;
i, index: integer;
begin
CRC16Lo := $FF; //CRC16Lo为CRC寄存器低8位
CRC16Hi := $FF; //CRC16Hi为CRC寄存器高8位
CL := $1;
CH := $A0; // A001 H 是CRC-16多项式代码
for i := 1 to Length(Data) do
begin
CRC16Lo := CRC16Lo xor ord(Data[i]); //每一个数据与CRC寄存器异或
for index := 0 to 7 do
begin
UseHi := CRC16Hi;
UseLo := CRC16Lo;
CRC16Hi := CRC16Hi shr 1;
CRC16Lo := CRC16Lo shr 1; //右移一位
if ((UseHi and $1) = $1) then //如果高位字节最后一位是1的话
CRC16Lo := CRC16Lo or $80; //低位字节右移后前面补1
if ((UseLo and $1) = $1) then //如果LSB 为1,则与多项式进行异或
begin
CRC16Hi := CRC16Hi xor CH;
CRC16Lo := CRC16Lo xor CL;
end;
end;
end;
Result := IntToHex(CRC16Lo, 2) + IntToHex(CRC16Hi, 2);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Label2.Caption :=ModBusCRC(Edit1.Text);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -