⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remoteupgrade.pas

📁 GPRS/CDMA DTU数据中心源代码,基于DataCenterX控件开发.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
     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 + -