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

📄 remoteupgrade.pas

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