📄 remoteupgrade.pas
字号:
unit remoteupgrade;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, SUIButton, Menus,bleepint,remotecfg;
const
CMD_REMOTEUPGRADE=$11;
DL_LEN=1024;//128;
//-------------------
CMD_DOWNLOAD=$2F;
DLTYPE_ASKDOWNLOAD=$01;
DLTYPE_TRANSCODE=$02;
DLTYPE_TRANSBLOCK=$03;
DLTYPE_TRANSEND=$04;
DL_OK=$F0;
DL_ERROR=$F1;
CMD_GETVER=$0D;
REPLY_VER=$0F;
//-------------------
FRAME_HEAD1=$AA;
FRAME_HEAD2=$55;
CMD_OK=$F0;
CMD_ERROR=$F1;
type
TfrmRemoteUpgrade = class(TForm)
Panel1: TPanel;
Timer1: TTimer;
StatusBar1: TStatusBar;
Panel2: TPanel;
GroupBox2: TGroupBox;
MainMenu1: TMainMenu;
N2: TMenuItem;
Memo1: TMemo;
Memo2: TMemo;
N3: TMenuItem;
GroupBox1: TGroupBox;
suiButton2: TsuiButton;
OpenDialog1: TOpenDialog;
ProgressBar1: TProgressBar;
CheckBox2: TCheckBox;
suiButton3: TsuiButton;
lbDTUInfo: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure suiButton2Click(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure N3Click(Sender: TObject);
procedure suiButton3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
xmodem1:tdtucom;
end;
var
EEPROMVM:array[1..1025000] of byte;
GEditMask:string;
frmRemoteUpgrade: TfrmRemoteUpgrade;
canceldown:boolean;
// function BuildDataPacket(Cmd:BYTE;Data:STRING):string;
implementation
uses main;
{$R *.dfm}
function HexToStr(i:integer):string;
var tmp:string;
begin
tmp:='0123456789ABCDEF ';
result:=tmp[(i div 16)+1]+tmp[(i mod 16)+1];
// result:=format('%x',[i]);
end;
function strtohex(s:string):integer;
var tmp:string;
i,j,a,b:integer;
begin
if s='' then
begin
result:=0;
exit;
end;
a:=0;
tmp:='0123456789ABCDEF ';
for j:=1 to length(s) do
begin
if s[j]=' ' then s[j]:='0';
i:=1;
while i<=16 do
begin
if tmp[i]=s[j] then
begin
b:=i-1;
break;
end;
i:=i+1;
end;
a:=a*16+b;
end;
result:=a;
end;
{
function BuildDataPacket(Cmd:BYTE;Data:STRING):string;
var LEN:INTEGER;
ACC:WORD;
S,tip:STRING;
i:integer;
begin
//len本身变成2字节。
LEN:=LENGTH(DATA)+3;
s:=chr(FRAME_HEAD1)+chr(FRAME_HEAD2)+CHR(LEN div 256)+CHR(LEN mod 256)+CHR(CMD)+DATA;
ACC:=0;
FOR I:=3 TO LENGTH(S) DO
BEGIN
ACC:=ACC+ord(S[I]);
END;
S:=S+chr(ACC div 256)+chr(ACC mod 256);
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmRemoteUpgrade.memo1.lines.add('下行:'+tip);
RESULT:=S;
end;
function WaitComData(wtime:integer):string;
var i:integer;
ss,s,tip:string;
begin
s:='';ss:='';
frmRemoteUpgrade.timer1.Enabled:=false; //禁止时钟读取串口数据
for i:=1 to (wtime div 20) do
begin
if frmRemoteUpgrade.XModem1.ReadString(s) then
begin
if s<>'' then break;
end;
sleep(50);
application.processmessages;
end;
ss:=s;
for i:=1 to (wtime div 20) do
begin
sleep(50);
if frmRemoteUpgrade.XModem1.ReadString(s) then
begin
ss:=ss+s;
end
else break;
application.processmessages;
end;
s:=ss;
//显示
if s<>'' then
begin
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmRemoteUpgrade.memo1.lines.add('上行:'+tip);
end;
frmRemoteUpgrade.timer1.Enabled:=true; //允许时钟读取串口数据
result:=s;
end;
function waitreply:integer;
var s:string;
i,r:integer;
head,data:string;
cmd:byte;
acc:word;
begin
s:=waitcomdata(4000);
if s='' then
begin
result:=-2;
exit;
end;
if ((s[1]<>chr(FRAME_HEAD1)) or (s[2]<>chr(FRAME_HEAD2))) then
begin
result:=-3;//非法的返回
exit;
end;
ACC:=0;
for I:=3 to LENGTH(S)-2 do
BEGIN
ACC:=ACC+ord(S[I]);
END;
if acc<>ord(s[6])*256+ord(s[7]) then
begin
result:=-4; //校验错误
exit;
end;
if length(s)=7 then
begin
if s[5]=chr(CMD_OK) then r:=0; //ok
if s[5]=chr(CMD_ERROR) then r:=-1; //error
end
else r:=-2; //timeout
result:=r;
end;
}
function BuildDataPacket(Cmd:BYTE;Data:STRING):string;
var LEN:INTEGER;
ACC:WORD;
S,tip:STRING;
i:integer;
begin
s:=chr(cmd)+data;
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmremoteupgrade.memo1.lines.add('下行:'+tip);
RESULT:=S;
end;
function WaitComData(wtime:integer):string;
var i:integer;
ss,s,tip:string;
begin
s:='';ss:='';
frmremoteupgrade.timer1.Enabled:=false; //禁止时钟读取串口数据
for i:=1 to (wtime div 100) do
begin
if frmremoteupgrade.XModem1.ReadString(s) then
begin
if s<>'' then break;
end;
sleep(100);
application.processmessages;
end;
ss:=s;
for i:=1 to (wtime div 100) do
begin
sleep(100);
if frmremoteupgrade.XModem1.ReadString(s) then
begin
ss:=ss+s;
end
else break;
application.processmessages;
end;
s:=ss;
//显示
if s<>'' then
begin
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmremoteupgrade.memo1.lines.add('上行:'+tip);
end;
frmremoteupgrade.timer1.Enabled:=true; //允许时钟读取串口数据
result:=s;
end;
function waitreply:integer;
var s:string;
i,r:integer;
head,data:string;
cmd:byte;
acc:word;
begin
s:=waitcomdata(4000*8);
if s='' then
begin
result:=-2;
exit;
end;
{
if ((s[1]<>chr(FRAME_HEAD1)) or (s[2]<>chr(FRAME_HEAD2))) then
begin
result:=-3;//非法的返回
exit;
end;
ACC:=0;
for I:=3 to LENGTH(S)-2 do
BEGIN
ACC:=ACC+ord(S[I]);
END;
if acc<>ord(s[6])*256+ord(s[7]) then
begin
result:=-4; //校验错误
exit;
end;
if length(s)=7 then
begin
if s[5]=chr(CMD_OK) then r:=0; //ok
if s[5]=chr(CMD_ERROR) then r:=-1; //error
end
else r:=-2; //timeout
}
if length(s)=1 then
begin
if s[1]=chr(CMD_OK) then r:=0; //ok
if s[1]=chr(CMD_ERROR) then r:=-1; //error
end
else r:=-2; //timeout
result:=r;
end;
//download functions----------------------------
function AskDownLoad(bank:integer):integer;
var DataFrame:string;
s:string;
r:integer;
acc,i:word;
begin
DataFrame:=chr(DLTYPE_ASKDOWNLOAD)+chr(bank);
frmRemoteUpgrade.xmodem1.SendString(BuildDataPacket(CMD_DOWNLOAD,DataFrame));
s:=waitcomdata(200*100);
{
if s='' then
begin
r:=-2;
end
else if ((s[1]<>chr(FRAME_HEAD1)) or (s[2]<>chr(FRAME_HEAD2))) then
begin
r:=-3;//非法的返回
end
else
begin
ACC:=0;
for I:=3 to LENGTH(S)-2 do
BEGIN
ACC:=ACC+ord(S[I]);
END;
if acc<>ord(s[6])*256+ord(s[7]) then
begin
result:=-4; //校验错误
exit;
end;
if length(s)=7 then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -