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

📄 unit1.pas

📁 手机串口通信的源代码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
end;


procedure Tform1.revalue(address: pointer; value: cardinal);
begin
  asm
mov     ecx,address
mov     eax, value
mov     edx, eax
mov     byte ptr [ecx], al
inc     ecx
shr     edx, 8
mov     byte ptr [ecx], dl
mov     edx, eax
inc     ecx
shr     edx, $10
shr     eax, $18
mov     byte ptr [ecx], dl
mov     byte ptr [ecx+1], al
  end;
end;

procedure tform1.SetTimeout(RI, RM, RC, WM, WC: integer);
begin

  siport.Timeouts.ReadInterval := RI; //RI  读取间隙
  siport.Timeouts.ReadTotalMultiplier := RM; //RM 读多倍
  siport.Timeouts.ReadTotalConstant := RC; //RC  读总常量  000
  siport.Timeouts.WriteTotalMultiplier := WM; //WM 写多倍
  siport.Timeouts.WriteTotalConstant := WC; //WC 写总常量   0000

end;

procedure TForm1.Open_btnClick(Sender: TObject);
begin
  if opendialog1.Execute then
    edit1.Text := opendialog1.FileName;
end;

procedure TForm1.Write_btnClick(Sender: TObject);
var
  mem: tmemorystream;
  filemem: tmemorystream;
  writebuf: array[0..8192] of byte;
  readbuf: byte;
  size: cardinal;
  i: dword;
  num: integer;
begin
  CX_Exit := false;
  richedit1.Clear;
  if not fileexists(edit1.Text) then
  begin
    shows := langs.ReadString('Hint', 'H0', '您选择的字库资料不存在!');
    showtext(clred, shows);
    exit;
  end;
  if not gl_cnndongle^ then exit;
  shows := langs.ReadString('Hint', 'H15', '请一直按住开机键,直到引导下载完成...');
  showtext(clred, shows);

  try
    siport.BaudRate := br115200;
    siport.Port := sibox.Text; {设置com口}
    siport.DataBits := dbeight; {8个数据位}

    siport.Connected := true;

    SetTimeout(0, 1, 3000, 1, 3000);
    siport.ClearBuffer(true, true);
    mem := tmemorystream.Create;
    mem.LoadFromStream(gl_boot);
    size := mem.Size;
    EnabledBtn(false);
    filemem := tmemorystream.Create;
    filemem.LoadFromFile(edit1.Text);

    if not gl_cnndongle^ then exit;

    shows := langs.ReadString('Hint', 'H14', '正在下载引导程序...');
    showtext(clblue, shows);
    for i := 1 to 160 do
    begin
      mem.Read(writebuf, 128);
      siport.Write(writebuf, 128);
      sleep(30);
      if CX_Exit = true then
      begin
        shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
        showtext(clred, shows);
        exit;
      end;
      gauge1.Progress := (i * 100) div 160;
      application.ProcessMessages;
    end;

    mem.Read(writebuf, 85);
    siport.Write(writebuf, 85);
    sleep(30);
    siport.BaudRate := br230400;

    siport.ClearBuffer(true, true);
    writebuf[0] := $41;
    siport.Write(writebuf, 1);
    sleep(50);
    num := siport.Read(readbuf, 1);
    if num = 0 then
    begin
      shows := langs.ReadString('Hint', 'H2', '下载BOOT失败!');
      showtext(clred, shows);
      exit;
    end;
    if readbuf <> $41 then
    begin
      shows := langs.ReadString('Hint', 'H3', '下载boot失败,请检查定义然后重新操作!');
      showtext(clred, shows);
      exit;
    end;
    gauge1.Progress := 100;
    shows := langs.ReadString('Hint', 'H4', '下载boot成功!');
    showtext(clgreen, shows);
    gauge1.Progress := 0;
    sleep(300);
    writebuf[0] := $05;
    siport.Write(writebuf, 1);
    sleep(30);
    num := siport.Read(readbuf, 1);
    if num = 0 then
    begin
      shows := langs.ReadString('Hint', 'H5', '通信错误05!');
      showtext(clred, shows);
      exit;
    end;

    sleep(300);
    writebuf[0] := $03;
    siport.Write(writebuf, 1);
    sleep(30);
    num := siport.Read(readbuf, 1);
    if num = 0 then
    begin
      shows := langs.ReadString('Hint', 'H6', '通信错误03!');
      showtext(clred, shows);
      exit;
    end;

    sleep(300);
    writebuf[0] := $04;
    siport.Write(writebuf, 1);

    filemem.Read(readbuf, 1);
    if readbuf <> 03 then
    begin
      shows := langs.ReadString('Hint', 'H7', '调入的字库资料不正确!');
      showtext(clred, shows);
      exit;
    end;
    if not gl_cnndongle^ then exit;
    size := filemem.Size;
    case size of
      $00800000..$008FFFFF: size := $00800000;
      $01000000..$01FFFFFF: size := $01000000;
    else
      begin
        shows := langs.ReadString('Hint', 'H8', '调入的资料不完整!');
        showtext(clred, shows);
        exit;
      end;
    end;
    writebuf[0] := 00;
    writebuf[1] := 00;
    writebuf[2] := 00;
    writebuf[3] := $90;
    revalue(@writebuf[4], size);
    siport.Write(writebuf, 8);
    sleep(30);
    i := 0;
    while true do
    begin
      siport.Read(readbuf, 1);
      sleep(10);
      inc(i);
      if (i <= $13) and (readbuf = $04) then break;
      if i >= $14 then
      begin
        shows := langs.ReadString('Hint', 'H9', '通信出错。');
        showtext(clred, shows);
        exit;
      end;
    end;
    if not gl_cnndongle^ then exit;
    writebuf[0] := 01;
    siport.Write(writebuf, 1);
    sleep(30);
    num := siport.Read(readbuf, 1);
    if num = 0 then
    begin
      shows := langs.ReadString('Hint', 'H10', '通信出错...');
      showtext(clred, shows);
      exit;
    end;
    if not gl_cnndongle^ then exit;
    filemem.Position := 0;
    shows := langs.ReadString('Hint', 'H11', '手机字库写入中,请稍后..');
    showtext(clgreen, shows);
    i := 0;
    SetTimeout(0, 1, 3000, 1, 3000);
    Gauge1.ForeColor := clBlue;
    repeat
      filemem.Read(writebuf, $2000);
      sleep(50);

      num := siport.Write(writebuf, $2000);
      if num <> $2000 then
      begin
        shows := langs.ReadString('Hint', 'H12', '通信中断..');
        showtext(clred, shows + inttostr(num));
        exit;
      end;
      i := i + $2000;
      gauge1.Progress := (i * 100) div size;
      if CX_Exit = true then
      begin
        shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
        showtext(clred, shows);
        exit;
      end;
      application.ProcessMessages;
    until i >= size;
    shows := langs.ReadString('Hint', 'H13', '手机字库写完毕!');
    showtext(clgreen, shows);

  finally
    EnabledBtn(True);
    gauge1.Progress := 0;
    siport.Connected := false;
    mem.Free;
    filemem.Free;

  end;
end;



procedure TForm1.FormCreate(Sender: TObject);
var MySysPath: pchar;
  rtcom: byte;
begin

  richedit1.Clear;
  gl_boot := TResourceStream.Create(Hinstance, 'TLDLL', 'boot');
//  langs := Tinifile.Create('langs.ini');
  gl_format := TResourceStream.Create(Hinstance, 'TLDLL', 'format');
  gl_read := TResourceStream.Create(HInstance, 'TLDLL', 'gl_read');
  GetMem(MySysPath, 255);
  Getsystemdirectory(MySysPath, 255);
  gl_path := extractfilepath(paramstr(0));

  langs := Tinifile.Create((gl_path + 'langs.ini'));

  gl_dllfile := 'c:\sivess.dll';
  if not fileexists(gl_dllfile) then
    ExtractRes('dll_file', 'TLDLL', gl_dllfile);

  if fileexists(gl_path + 'langs.ini') then
  begin
    form1.Caption := 'VE-SI4904 Flasher V2.1';
    LABEL3.Caption := 'BaudRate:';
    LABEL4.Caption := 'Flash Size:';
    label1.Caption := 'flash file:';
    groupbox1.Caption := 'setup';
    groupbox2.Caption := 'Info: (www.ve100.com  www.xintel.com.cn)';
    Write_btn.Caption := 'Flash';
    Stop_btn.Caption := 'Stop';
    Format_btn.caption := 'Format';
    Readpwd_btn.Caption := 'Rd/PWD';
    Read_btn.Caption := 'Read';
  end;
  formcaption := Form1.Caption;

  if check_pl2303(rtcom) then
  begin
    showText(clblue, 'PL2303 USB2COM : COM' + inttostr(rtcom));
    sibox.Text := 'COM' + inttostr(rtcom);
  end;

end;

procedure TForm1.Stop_btnClick(Sender: TObject);
begin
  CX_Exit := true;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
  Status, ri, xi: integer;
  RegName: array[0..255] of char;
  regsn: string;
  regdg: cardinal;

  btbuf: array[0..$FF] of byte;
  i: integer;
  btxor: byte;
begin
  EnabledBtn(false);
  gl_cnndongle^ := false;
  shows := langs.ReadString('Hint', 'G35', '正在查找可用加密狗...');
  showText(clBlue, shows);
  gl_QTDongle := 0;

  if gl_QTDongle = 0 then
    if not QT_Dongle then
    begin
      shows := langs.ReadString('Hint', 'G36', '没有找到惟易加密狗!');
      showText(clRed, shows);
     // exit;
    end;
  EnabledBtn(True);

  gl_cnndongle^ := true;
  shows := 'Define: VCC:4,5    GND:2,7,17 ' + #13#10 + '  RXD:13(Hight)   TXD:11   NBoot:6(low)';
  showtext(clblack, shows);

end;

procedure TForm1.Format_btnClick(Sender: TObject);
var
  mem: TmemoryStream;
  size, i: cardinal;
  writebuf: array[0..8192] of byte;

begin

  try
    EnabledBtn(false);
    CX_Exit := false;
    //richedit1.Clear;

    siport.BaudRate := br115200;
    siport.Port := sibox.Text; {设置com口}
    siport.DataBits := dbeight; {8个数据位}

    siport.Connected := true;

    SetTimeout(0, 1, 3000, 1, 3000);
    siport.ClearBuffer(true, true);
    mem := tmemorystream.Create;
    mem.LoadFromStream(gl_boot);
    size := mem.Size;

    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);
    for i := 1 to 160 do
    begin
      mem.Read(writebuf, 128);
      siport.Write(writebuf, 128);
      sleep(30);
      if CX_Exit = true then
      begin
        shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
        showtext(clred, shows);
        exit;
      end;
      gauge1.Progress := (i * 100) div 160;
      application.ProcessMessages;
    end;

    mem.Read(writebuf, 85);
    siport.Write(writebuf, 85); //写引导完毕
    sleep(30);
    gauge1.Progress := 0;
    siport.ClearBuffer(true, true);


    case combobox1.ItemIndex of //设置波特率
      0:
        siport.BaudRate := br921600;
      1:
        siport.BaudRate := br460800;
      2:
        siport.BaudRate := br230400;
      3:
        siport.BaudRate := br115200;
    end;

    sleep(30);

    writebuf[0] := $41;
    siport.Write(writebuf, 1);
    sleep(30);
    i := siport.Read(writebuf, 1);
    if i = 0 then
    begin
      shows := langs.ReadString('Hint', 'F1', 'error04!');
      showtext(clred, shows);
      exit;
    end;

    sleep(30);
    for i := 0 to 9 do
      writebuf[i] := 0;

    writebuf[0] := 04;
    writebuf[4] := $90;

    case combobox2.ItemIndex of
      1:
        begin
          size := $E0000;
          writebuf[3] := $F0; //16M
          writebuf[7] := $0E;
        end;
      0:
        begin
          size := $70000;
          writebuf[3] := $78; //8M
          writebuf[7] := $07;
        end;
    end;

    siport.Write(writebuf, 9);
    sleep(30);
    i := siport.Read(writebuf, 1);
    if i = 0 then
    begin
      shows := langs.ReadString('Hint', 'F1', 'error09!');
      showtext(clred, shows);
      exit;
    end;

    writebuf[0] := $01;
    siport.Write(writebuf, 1);
    sleep(30);
    i := siport.Read(writebuf, 1);
    if i = 0 then
    begin
      shows := langs.ReadString('Hint', 'F1', 'error01!');
      showtext(clred, shows);
      exit;
    end;

    for i := 0 to 8192 do
      writebuf[i] := $FF;

    shows := langs.ReadString('Hint', 'H16', '正在格式化...!');
    showtext(clgreen, shows);

    SetTimeout(0, 1, 4000, 1, 4000);
    case size of
      $E0000:
        begin
          for i := 0 to 69 do
          begin
            siport.Write(writebuf, 8192);
            sleep(50); //16m
            gauge1.Progress := (i * 100) div $69;
            application.ProcessMessages;
          end;
        end;
      $70000:
        begin
          for i := 0 to $37 do
          begin
            siport.Write(writebuf, 8192);
            sleep(50); //8M
            gauge1.Progress := (i * 100) div $37;
            application.ProcessMessages;
          end;
        end;
    end;

    shows := langs.ReadString('Hint', 'H17', '格式化完毕!');
    showtext(clgreen, shows);
  finally
    EnabledBtn(True);
    gauge1.Progress := 0;
    mem.Free;
  end;
end;

procedure TForm1.EnabledBtn(ok: Boolean);
begin
  Write_btn.Enabled := ok;
  Read_btn.Enabled := ok;
  Format_btn.Enabled := ok;
  Readpwd_btn.Enabled := ok;
  Open_btn.Enabled := ok;
end;

procedure TForm1.Readpwd_btnClick(Sender: TObject);

⌨️ 快捷键说明

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