📄 remoteupgrade.pas
字号:
begin
if s[5]=chr(CMD_OK) then r:=0 //ok
else if s[5]=chr(CMD_ERROR) then r:=-1 //error
else r:=-3; //非法的返回
end;
end;
}
if length(s)=1 then
begin
if s[1]=chr(CMD_OK) then r:=0 //ok
else if s[1]=chr(CMD_ERROR) then r:=-1 //error
else r:=-3; //非法的返回
end;
result:=r;
end;
function TransCode(Addr:integer;Len:integer;CodeData:string):integer;
var DataFrame:string;
begin
DataFrame:=chr(DLTYPE_TRANSCODE)+
chr(addr div 65536)+chr((addr mod 65536) div 256)+chr(addr mod 256)+
chr(len div 256)+chr(len mod 256)+
CodeData;
frmRemoteUpgrade.xmodem1.SendString(BuildDataPacket(CMD_DOWNLOAD,DataFrame));
result:=waitreply;
end;
function TransBlock(Addr:integer;Len:integer;BLOCKByte:Byte):integer;
var DataFrame:string;
begin
DataFrame:=chr(DLTYPE_TRANSBLOCK)+
chr(addr div 65536)+chr((addr mod 65536) div 256)+chr(addr mod 256)+
chr(len div 256)+chr(len mod 256)+
chr(BLOCKBYTE);
frmRemoteUpgrade.xmodem1.SendString(BuildDataPacket(CMD_DOWNLOAD,DataFrame));
result:=waitreply;
end;
function TransEnd:integer;
var DataFrame:string;
begin
DataFrame:=chr(DLTYPE_TRANSEND);
frmRemoteUpgrade.xmodem1.SendString(BuildDataPacket(CMD_DOWNLOAD,DataFrame));
result:=waitreply;
end;
//--------------------------------------------------
function GetVer:String;
var DataFrame:string;
s,version:string;
i,verlen:integer;
begin
frmRemoteUpgrade.xmodem1.remotetype:=CMD_REMOTECFG;
DataFrame:='';
frmRemoteUpgrade.xmodem1.SendString(BuildDataPacket(CMD_GETVER,DataFrame));
s:=waitcomdata(2000*10);
frmRemoteUpgrade.xmodem1.remotetype:=CMD_REMOTEUPGRADE;
if s='' then
begin
result:='错误:设备无应答';
exit;
end;
if s[1]=chr($81) then
begin
result:='错误:设备返回$81';
exit;
end;
// if s[1]=chr($88) then
begin
verlen:=ord(s[1]);
version:=copy(s,2,verlen);
result:='版本号:'+version;
exit;
end;
end;
//---------setting funcitons-----------------------------
//--------------------------------------------------------------
procedure TfrmRemoteUpgrade.Timer1Timer(Sender: TObject);
var tip,s:string;
i:integer;
begin
// if xmodem1.Opened=false then exit;
{
if xmodem1.ReadString(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;
}
end;
procedure TfrmRemoteUpgrade.CheckBox1Click(Sender: TObject);
begin
// memo1.Visible:=checkbox1.Checked;
end;
function isdigitstr(valuestr:string):boolean;
var r:integer;
begin
try
r:=strtoint(valuestr)
except
result:=false;
exit;
end;
result:=true;
end;
procedure TfrmRemoteUpgrade.N1Click(Sender: TObject);
var r:integer;
begin
if MessageBox(self.Handle,'真的要恢复出厂默认设置吗?','提示',IDOK)=IDOK then
begin
end;
frmRemoteUpgrade.Memo1.Lines.Add(frmRemoteUpgrade.StatusBar1.Panels[3].Text);
end;
procedure TfrmRemoteUpgrade.N2Click(Sender: TObject);
var r:integer;
begin
if MessageBox(self.Handle,'真的要切换程序吗?','提示',IDOK)=IDOK then
begin
frmRemoteUpgrade.memo2.lines.add('[程序切换]');
r:=TransEnd;
if r=0 then frmRemoteUpgrade.memo2.Lines.add('[切换成功]');
if r=-1 then frmRemoteUpgrade.memo2.Lines.add('[切换失败]');
if r=-2 then frmRemoteUpgrade.memo2.Lines.add('[切换失败,设备无应答]');
end;
end;
function CHECKFF(s:string;len:integer):boolean;
var i,count:integer;
begin
if length(s)<>len then
begin
result:=false;
exit;
end;
count:=0;
for i:=1 to length(s) do
begin
if s[i]<>chr($FF) then
begin
count:=count+1;
break;
end;
end;
if count=0 then result:=true
else result:=false;
end;
function UpgradeFW:integer;
var i,r:integer;
DataFile: file of Byte;
filelen:longint;
rsize:longint;
buff,buff_prev,buff_next:string;
fwadd,address,count:int64;
a,b,c,bank:byte;
begin
setlength(buff,DL_LEN);
setlength(buff_prev,DL_LEN);
setlength(buff_next,DL_LEN);
frmRemoteUpgrade.opendialog1.FileName:='*.bin';
frmRemoteUpgrade.opendialog1.Title:='选择Bin文件';
if frmRemoteUpgrade.opendialog1.Execute=false then exit;
//-----------------------
try
AssignFile(DataFile,frmRemoteUpgrade.opendialog1.FileName);
Reset(DataFile);
rsize:=FileSize(DataFile);
CloseFile(DataFile);
AssignFile(DataFile,frmRemoteUpgrade.opendialog1.FileName);
Reset(DataFile);
BlockRead(DataFile,EEPROMVM,rsize,filelen);
CloseFile(DataFile);
except
showmessage('读取文件失败!');
result:=-4;
exit;
end;
//取出倒数第2,3,4字节
a:=EEPROMVM[rsize-1] mod 16;
b:=EEPROMVM[rsize-2];
c:=EEPROMVM[rsize-3];
fwadd:=a*65536+b*256+c;
if (fwadd>=$80000) and (fwadd<$B0000) then
begin
bank:=1;
frmRemoteUpgrade.memo2.lines.add('[程序下载到80000地址]');
end
else if (fwadd>=$B0000) and (fwadd<$E0000) then
begin
bank:=2;
frmRemoteUpgrade.memo2.lines.add('[程序下载到B0000地址]');
end
else
begin
showmessage('文件非法!');
result:=-5;
exit;
end;
// BlockRead(DataFile,EEPROMVM,2,filelen);
//-----------------------
frmRemoteUpgrade.memo2.lines.add('[请求程序下载]');
while canceldown=false do
begin
r:=askdownload(bank);
if r=0 then
begin
frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[允许下载]';
frmRemoteUpgrade.memo2.lines.Add(frmRemoteUpgrade.StatusBar1.Panels[3].Text);
end
else if r=-1 then
begin
frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[禁止下载]';
frmRemoteUpgrade.memo2.lines.Add(frmRemoteUpgrade.StatusBar1.Panels[3].Text);
break;
end
else if r=-2 then
begin
frmRemoteUpgrade.memo2.lines.Add('等待应答中...');
end;//frmRemoteUpgrade..StatusBar1.Panels[3].Text:='[请求失败,设备无响应!]';
//frmRemoteUpgrade..memo2.lines.Add(frmRemoteUpgrade..StatusBar1.Panels[3].Text);
if r=0 then break;
end;
if r<0 then
begin
result:=r;
exit;
end;
if bank=1 then Address:=$80000;
if bank=2 then Address:=$B0000;
count:=0;
frmRemoteUpgrade.memo2.lines.add('[程序下载中...]'); // sleep(200);
frmRemoteUpgrade.progressbar1.position:=0;
while count<rsize do
begin
if canceldown=true then
begin
frmRemoteUpgrade.memo2.Lines.add('[下载被取消]');
result:=-10;
exit;
end;
//读取DL_Len字节
for i:=1 to DL_LEN do
begin
buff[i]:=chr(EEPROMVM[count+i]);
end;
if count >= DL_LEN then
begin
//读取Prev包
for i:=1 to DL_LEN do
begin
buff_prev[i]:=chr(EEPROMVM[count-DL_LEN+i]);
end;
end;
if count <= rsize-(DL_LEN*2) then
begin
//读取next包
for i:=1 to DL_LEN do
begin
buff_next[i]:=chr(EEPROMVM[count+DL_LEN+i]);
end;
end;
if CHECKFF(buff,DL_LEN)=true then
begin
if CheckFF(buff_prev,DL_LEN) and CheckFF(buff_next,DL_LEN) then
begin
frmRemoteUpgrade.memo2.lines.add('[地址'+format('%x',[address+count])+'为全FF包,已跳过该包');
count:=count+DL_LEN;
frmRemoteUpgrade.progressbar1.position:=(count*100) div rsize;
application.ProcessMessages;
continue;
end
else
begin
// memo2.lines.add('[地址'+format('%x',[address+count])+'为全FF包,已下传');
end;
end;
r:=TransCode(Address+count,DL_LEN,buff);
if r=0 then
begin
frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[地址'+format('%x',[address+count])+'下载成功]';
count:=count+DL_LEN;
end;
if r=-1 then frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[地址'+format('%x',[address+count])+'下载失败]';
if r=-2 then frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[地址'+format('%x',[address+count])+'下载失败,设备无响应!]';
if r=-3 then frmRemoteUpgrade.StatusBar1.Panels[3].Text:='[地址'+format('%x',[address+count])+'下载失败,未知错误代码!]';
frmRemoteUpgrade.memo2.lines.add(frmRemoteUpgrade.StatusBar1.Panels[3].Text);
if r<0 then sleep(2000);
frmRemoteUpgrade.progressbar1.position:=(count*100) div rsize;
application.ProcessMessages;
end;
if frmRemoteUpgrade.checkbox2.Checked=false then
begin
result:=r;
exit;
end;
frmRemoteUpgrade.memo2.lines.add('[下载完成,程序切换]');
r:=TransEnd;
if r=0 then frmRemoteUpgrade.memo2.Lines.add('[切换成功]');
if r=-1 then frmRemoteUpgrade.memo2.Lines.add('[切换失败]');
if r=-2 then frmRemoteUpgrade.memo2.Lines.add('[切换失败,设备无应答]');
result:=r;
bleep(bok);
end;
procedure TfrmRemoteUpgrade.suiButton2Click(Sender: TObject);
begin
suibutton3.Visible:=true;
canceldown:=false;
UpgradeFW;
suibutton3.Visible:=false;
end;
procedure TfrmRemoteUpgrade.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
key:=chr(0);
end;
procedure TfrmRemoteUpgrade.N3Click(Sender: TObject);
var s:string;
begin
s:=getver;
frmRemoteUpgrade.memo2.Lines.Add(s);
end;
procedure TfrmRemoteUpgrade.suiButton3Click(Sender: TObject);
begin
canceldown:=true;
suibutton3.Visible:=false;
end;
procedure TfrmRemoteUpgrade.FormActivate(Sender: TObject);
begin
{
xmodem1.BaudRate:=br38400;
xmodem1.OpenDevice;
if xmodem1.Opened then statusbar1.Panels[1].text:=edit1.text+'打开成功,BaudRate='+combobox1.text
else statusbar1.Panels[1].text:=edit1.text+'打开失败';
}
end;
procedure TfrmRemoteUpgrade.FormCreate(Sender: TObject);
begin
xmodem1:=tdtucom.Create;
xmodem1.dataocx:=frmMain.DataCenterX1;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -