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

📄 unit1.pas

📁 手机串口通信的源代码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
var
  ms: TmemoryStream;
  p: pointer;
  p1: ^Byte;
  ads, js, editpwd: string;
  sl: Tstringlist;
  vi, i, size, j, j1, newaddr: cardinal;
  rpfind: boolean;
  b1, v1: byte;

  P2_nsize: cardinal;
  P2_buf: byte;
  P2_num: byte;
  P2_read, P2_s: string;
  P2_pos1, P2_pos2: cardinal;
  p2_mem: TmemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    editpwd := OpenDialog1.FileName;
  end;
  if not fileexists(editpwd) then
  begin
    exit;
  end;
  try
    EnabledBtn(False);
    if not gl_cnndongle^ then exit;

    P2_mem := Tmemorystream.Create;
    P2_mem.LoadFromFile(editpwd);
    P2_nsize := P2_mem.Size;
    sl := Tstringlist.Create;
    sl.Clear;
    if fileexists(gl_path + 'langs.ini') then
    begin
      sl.Add('----Flash PWD----')
    end else
      sl.Add('----字库密码:----');

    p2_mem.Position := P2_nsize - $400000;
    repeat
      P2_pos1 := P2_mem.Position;
      P2_pos2 := P2_mem.Position;
      P2_mem.ReadBuffer(P2_buf, 1); //  or ((chr(P2_buf) = '#') or (chr(P2_buf) = '*'))
      if ((chr(P2_buf) >= '0') and (chr(P2_buf) <= '9')) then
      begin
        P2_read := P2_read + chr(P2_buf);
        P2_num := length(P2_read);
      end
      else
      begin
        if (P2_num <= 8) and (P2_num >= 4) then
        begin
          P2_pos1 := P2_pos1 + 8 - P2_num;
          P2_mem.Position := P2_pos1;
          P2_mem.read(P2_buf, 1);
         // if (ord(P2_buf) >= 04) and (ord(P2_buf) <= 8) then
          if ord(P2_buf) = p2_num then
          begin
            j1 := 0;
            for j := 0 to sl.Count - 1 do
            begin
              if (pos(P2_read, sl.Strings[j]) > 0) then
              begin
                j1 := 1;
                break;
              end;
            end;
            if j1 = 0 then
            begin
              if fileexists(gl_path + 'langs.ini') then
              begin
                sl.Add('PassWord: ' + P2_read);
              end else
                sl.Add('密码可能是: ' + P2_read);
            end;
          end;

        end;
        if not gl_cnndongle^ then exit;
        P2_read := '';
        P2_num := 0;
        P2_pos2 := P2_pos2 + 1;
        P2_mem.Position := P2_pos2;
        application.ProcessMessages;
      end;

     // if P2_pos1 > 0 then
      //  gauge1.Progress := (P2_pos1 * 100) div (P2_nsize div 100);
     // hitegaugetotitle(Gauge1.Progress);

    until P2_pos1 >= P2_nsize - 1;
  //  renewtitle;

    if not gl_cnndongle^ then exit;

    if sl.Count > 1 then
    begin
      //richedit1.Lines.AddStrings(sl);
      for i := 0 to sl.Count - 1 do
      begin
        if i = 0 then
          showText(clblue, sl.Strings[i])
        else
          showText(clgreen, sl.Strings[i]);
      end;
      shows := langs.ReadString('Hint', 'H28', '查找完成.');
      showText(clRed, shows);
    end else
    begin
      shows := langs.ReadString('Hint', 'H29', '密码可能为空!');
      showText(clRed, shows);
    end;
  finally
    EnabledBtn(True);
    P2_mem.Free;
  end;
end;

procedure TForm1.Read_btnClick(Sender: TObject);

begin
  try
    CX_Exit := false;
    EnabledBtn(False);
    SetTimeout(1000, 500, 1000, 500, 2000);
    siport.BaudRate := br115200;
    siport.Port := sibox.Text; {设置com口}
    siport.DataBits := dbeight; {8个数据位}

    siport.Connected := true;
    //SetTimeout(0, 1, 3000, 1, 3000);

    if not gl_cnndongle^ then exit;

    shows := langs.ReadString('Hint', 'H15', '提示:请一直按住开机键,直到引导下载完成...');
    showtext(clred, shows);

    if not Cnn then exit;
    shows := langs.ReadString('Hint', 'H18', '已联接到手机.');
    showText(clGreen, shows);

    shows := langs.ReadString('Hint', 'H14', '正在下载引导程序...');
    showtext(clblue, shows);

    if not Si_boot(gl_read) then exit;

    if not Readcpuinfo() then exit;

    if not Flashread() then exit;


  finally
    EnabledBtn(True);
    siport.Connected := false;
    gauge1.Progress := 0;
  end;
end;

function TForm1.Cnn: Boolean;
var
  wbuf, rbuf: array[0..$FF] of byte;
  time: cardinal;
  rdi, cnn: integer;
begin
  Result := false;
  siport.ClearBuffer(true, true);
  sleep(10);
  cnn := 0;
  time := Gettickcount;
  CX_Exit := false;
  wbuf[0] := $16;
  repeat
    application.ProcessMessages;
    siport.Write(wbuf, 1);
    sleep(30);
    rdi := siport.Read(rbuf, 1);
    if (rdi = 1) and (rbuf[0] = $16) then
    begin
      cnn := 1;
     // shows := langs.ReadString('Hint', 'Hxx', '手动中断退出!');
     // showText(clRed, shows);
      break;
    end;

  until
    (Gettickcount - time > 20000) or (CX_Exit = true); //5秒

  if CX_Exit then
  begin
    shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
    showText(clRed, shows);
    exit;
  end;

  if cnn = 0 then
  begin
    shows := langs.ReadString('Hint', 'H19', '联接失败,超时退出!');
    showText(clRed, shows);
    exit;
  end;

  result := true;
end;

function TForm1.Si_boot(ms: TStream): Boolean;
var
  mis: TMemoryStream;
  size, sendsize: Cardinal;
  wrbuf, rdbuf: array[0..$FFFF] of byte;
  i: integer;
begin
  Result := False;
  try
    mis := tmemorystream.Create;
    mis.LoadFromStream(ms);
    size := mis.Size;
    mis.Position := 0;
    i := 0;
    sendsize := 128;
    Gauge1.ForeColor := clBlue;
    repeat
      if size - i < sendsize then
        sendsize := size - i;
      CX_Exit := False;
      mis.Read(rdbuf, sendsize);
      siport.Write(rdbuf, sendsize);
      Sleep(50);

      i := mis.Position;

      gauge1.Progress := (i * 100) div size;
      application.ProcessMessages;

    until (i >= size) or (CX_Exit = true);

    if CX_Exit then
    begin
      shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
      showText(clRed, shows);
      exit;
    end;
    Result := True;
  finally
    mis.Free;
  end;
end;

function TForm1.Readcpuinfo: boolean;
var
  rd, wr, newwr, newrd: array[0..$FF] of byte;
  rdi, i, j, v1, v2: integer;
  val35, val35be: Cardinal;
  strin: string;
begin
  Result := False;

  siport.CustomBaudRate := 812500;
  siport.BaudRate := brcustom;
  //siport.ClearBuffer(true, true);

  Sleep(10);
  if not gl_cnndongle^ then exit;
  siport.ClearBuffer(true, true);

  wr[0] := $41;
  rdi := siport.Write(wr, 1);
  if rdi <> 1 then
    exit;
  sleep(30);
  //    siport.Read(rd, 1);
 // until rd[0] = $41;

  rdi := siport.Read(rd, 12);
  if rdi <> 12 then
  begin
    shows := langs.ReadString('Hint', 'H20', '读数据1失败!');
    showText(clRed, shows);
    exit;
  end;
  j := 0;
  for i := 2 to 9 do
  begin
    newrd[j] := rd[i];
    inc(j);
  end;

  val35be := CheckSum(newrd, 8);
  val35 := ((newrd[1] xor newrd[3]) shl 8) + (val35be and $FF);
  newwr[0] := (val35 xor $7778) shr 8;
  newwr[1] := (val35 xor $7778) and $FF;
  newwr[2] := (val35 xor $D2D1) shr 8;
  newwr[3] := (val35 xor $D2D1) and $FF;
  newwr[4] := (val35 xor $800) shr 8;
  newwr[5] := (val35 xor $800) and $FF;
  newwr[6] := CheckSum(newwr, 6) shr 8;
  newwr[7] := CheckSum(newwr, 6) and $FF;

  siport.Write(newwr, 8);
  Sleep(30);
  wr[0] := $8A;
  siport.Write(wr, 1);
  sleep(50);
  rdi := siport.Read(rd, 19);
  if rdi <> 19 then
  begin
    shows := langs.ReadString('Hint', 'H21', '读数据2失败!');
    showText(clRed, shows);
    exit;
  end;
 { v2 := 0;
  for v1 := 9 downto 6 do
  begin
    newrd[v2] := rd[v1];
    inc(v2);
  end; }


  if not gl_cnndongle^ then exit;

 // count := ((newrd[0] shl 24) + (newrd[1] shl 16) + (newrd[2] shl 8) + newrd[3]) div $800;
//  showText(clRed, inttostr(count));

  gl_flashsize := (rd[7] shl 24) + (rd[8] shl 16) + (rd[9] shl 8) + rd[10];
  gl_flashid1 := (rd[11] shl 24) + (rd[12] shl 16) + (rd[13] shl 8) + rd[14];
  gl_flashid2 := (rd[15] shl 24) + (rd[16] shl 16) + (rd[17] shl 8) + rd[18];

  shows := langs.ReadString('Hint', 'H22', '字库型号:') + ' ';
  showText(clblue, shows + flashid(gl_flashid1, gl_flashid2));
  shows := langs.ReadString('Hint', 'H23', '字库代码:');
  showText(clblue, shows + inttohex(gl_flashid1, 8) + ' (' + inttohex(gl_flashid2, 8) + ')');
  shows1 := langs.ReadString('Hint', 'H24', '字库大小:');
  showText(clblack, shows1 + inttohex(gl_flashsize, 8) +
    ' (' + inttostr(gl_flashsize div $100000) + '.' + inttostr((gl_flashsize mod $100000) div 1024) + 'M)');

  Result := True;
end;


function Tform1.flashid(id: cardinal; id2: cardinal): string;
var s: string;
begin
  if (id = $00EC257E) then begin result := 'K5L6331CAM'; exit; end;
  if (id = $00208810) then begin result := 'M36WOR'; exit; end;
  if (id = $0001227E) then begin result := 'S71GL128NB'; exit; end;
end;

function TForm1.Flashread: boolean;
var
  tt: cardinal;
  wr, rd, newwr: array[0..$FF] of byte;
  rdbuf, newrdbuf: array[0..$FFFF] of byte;
  rdi, i, j, j1: integer;
  neword, rdsize: Cardinal;
  ms: Tmemorystream;
begin
  Result := False;
  tt := gettickcount;
  CX_Exit := false;
  shows := langs.ReadString('Hint', 'H25', '正在读字库...');
  showText(clgreen, shows);
  try
    ms := TMemoryStream.Create;
    ms.Position := 0;

    wr[0] := $77;
    wr[1] := $78;
    wr[2] := $8A;
    siport.Write(wr, 3);
    Sleep(50);
    rdi := siport.Read(rdbuf, 2048);
    if (rdi <> 2048) then
    begin
      shows := langs.ReadString('Hint', 'H26', '读字库信息1出错!');
      showText(clgreen, shows);
      renewtitle;
      exit;
    end;

    ms.Write(rdbuf, 2048);

    neword := CheckSum(rdbuf, 2048);
    i := 2048;
    rdsize := 2048;

    repeat
   //   if gl_flashsize - i < rdsize then
  //      rdsize := gl_flashsize - i;
      wr[0] := $8A;
      wr[1] := neword shr 8; //h
      wr[2] := neword and $FF; //l
      siport.Write(wr, 3);
      Sleep(30);

      rdi := siport.Read(rdbuf, 2049);
      if (rdi <> 2049) or (rdbuf[0] <> $8A) then
      begin
        shows := langs.ReadString('Hint', 'H27', '读字库信息2出错!');
        showText(clgreen, shows);
        renewtitle;
        exit;
      end;
      j1 := 0;
      for j := 1 to 2048 do
      begin
        newrdbuf[j1] := rdbuf[j];
        inc(j1);
      end;

      neword := CheckSum(newrdbuf, 2048);

      ms.Write(newrdbuf, 2048);

      i := i + rdsize;

      if i > 0 then
        gauge1.Progress := i div (gl_flashsize div 100);
      hitegaugetotitle(Gauge1.Progress);

      application.ProcessMessages;

    until (i >= gl_flashsize) or (CX_Exit = True);

    renewtitle;  

    if CX_Exit then
    begin
      shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
      showText(clRed, shows);
      exit;
    end;

    shows := langs.ReadString('Hint', 'H30', '操作已完成.');
    showText(clGreen, shows);

    if not gl_cnndongle^ then exit;
    if gl_flashsize > 0 then
    begin
      if savedialog1.Execute then
        ms.SaveToFile(savedialog1.FileName + '.bin');
    end;
    result := true;
  finally
    ms.Free;
    Gauge1.Progress := 0;
  end;
end;


function Tform1.hitegaugetotitle(int: integer): boolean;
var
  sr, sren: string;
  caption: string;
begin
  sr := inttostr(int) + '%' + #32#32 + 'VE-SI';
  if not fileexists(gl_path + 'langs.ini') then
  begin
    SendMessage(Form1.Handle, WM_SETREDRAW, 0, 0);
    caption := formcaption; // := '惟易SI4904平台 V2.0  '; // ;
    sren := caption + #32 + #32 + inttostr(int) + '%';
    setWindowText(Handle, PAnsiChar(sren));
    Application.Title := sr;
    SendMessage(Form1.Handle, WM_SETREDRAW, 1, 0); //
    sendmessage(Form1.Handle, WM_SETTINGCHANGE, 0, 0);
  end
  else
  begin
    SendMessage(Form1.Handle, WM_SETREDRAW, 0, 0);
    caption := formcaption; // := '惟易SI4904平台 V2.0  '; // ;
    sren := caption + #32 + #32 + inttostr(int) + '%';
    SetWindowText(Handle, PAnsiChar(sren));
    Application.Title := sr;
    SendMessage(Form1.Handle, WM_SETREDRAW, 1, 0); //
    sendmessage(Form1.Handle, WM_SETTINGCHANGE, 0, 0);
  end;
end;

procedure Tform1.renewtitle;
begin
  Application.Title := 'VE-SI Software';
  if not fileexists(gl_path + 'langs.ini') then
  begin
    Form1.Caption := formcaption;
  end
  else
  begin
    Form1.Caption := formcaption;
  end;
end;

initialization
  New(gl_cnndongle); //内存中的动态变量
finalization

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -