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

📄 unit1.pas

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

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Gauges, CPort, WinSkinData,
  CPortCtl, Buttons, inifiles;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    siport: TComPort;
    OpenDialog1: TOpenDialog;
    sibox: TComComboBox;
    Edit1: TEdit;
    Open_btn: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Write_btn: TBitBtn;
    ComboBox1: TComboBox;
    Label3: TLabel;
    ComboBox2: TComboBox;
    Label4: TLabel;
    Stop_btn: TBitBtn;
    Format_btn: TBitBtn;
    Readpwd_btn: TBitBtn;
    Read_btn: TBitBtn;
    SaveDialog1: TSaveDialog;
    GroupBox2: TGroupBox;
    Gauge1: TGauge;
    RichEdit1: TRichEdit;
    procedure Open_btnClick(Sender: TObject);
    procedure Write_btnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Stop_btnClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Format_btnClick(Sender: TObject);
    procedure Readpwd_btnClick(Sender: TObject);
    procedure Read_btnClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
    procedure showText(Cl: Tcolor; text: string; bold: boolean = false);
     function QT_MainEXE(cmd: byte; fileid: word; offset: Word; len: byte; indata: Pbyte; outdata: Pbyte): boolean;
    function QT_Dongle: Boolean;

    procedure revalue(address: pointer; value: cardinal);
    procedure SetTimeout(RI, RM, RC, WM, WC: integer);
    procedure EnabledBtn(ok: Boolean);
    function Cnn(): Boolean;
    function Si_boot(ms: TStream): Boolean;
    function Readcpuinfo(): boolean;
    function Flashread(): boolean;
    function CheckSum(data: array of byte; len: integer): integer;
    function flashid(id: cardinal; id2: cardinal): string;

    function hitegaugetotitle(int: integer): boolean;
    procedure renewtitle;


  end;
type
 // PFILE_DATA = ^TFILE_DATA;
  FILE_DATA = record
    bCommand: byte; //  command type*/
    wFileID: word; //  file ID */
    wOffset: word; //  access offset */
    bDataLen: byte; //  data length */
    pbData: array[0..200] of byte; //  data */
  end;

const
  checkdata: array[0..$203] of byte =
  ($00, $00, $FF, $0F, $FE, $0F, $01, $00, $FD, $0F,
    $02, $00, $03, $00, $FC, $0F, $FC, $0F, $03, $00,
    $02, $00, $FD, $0F, $01, $00, $FE, $0F, $FF, $0F,
    $00, $00, $FB, $0F, $04, $00, $05, $00, $FA, $0F,
    $06, $00, $F9, $0F, $F8, $0F, $07, $00, $07, $00,
    $F8, $0F, $F9, $0F, $06, $00, $FA, $0F, $05, $00,
    $04, $00, $FB, $0F, $FA, $0F, $05, $00, $04, $00,
    $FB, $0F, $07, $00, $F8, $0F, $F9, $0F, $06, $00,
    $06, $00, $F9, $0F, $F8, $0F, $07, $00, $FB, $0F,
    $04, $00, $05, $00, $FA, $0F, $01, $00, $FE, $0F,
    $FF, $0F, $00, $00, $FC, $0F, $03, $00, $02, $00,
    $FD, $0F, $FD, $0F, $02, $00, $03, $00, $FC, $0F,
    $00, $00, $FF, $0F, $FE, $0F, $01, $00, $F9, $0F,
    $06, $00, $07, $00, $F8, $0F, $04, $00, $FB, $0F,
    $FA, $0F, $05, $00, $05, $00, $FA, $0F, $FB, $0F,
    $04, $00, $F8, $0F, $07, $00, $06, $00, $F9, $0F,
    $02, $00, $FD, $0F, $FC, $0F, $03, $00, $FF, $0F,
    $00, $00, $01, $00, $FE, $0F, $FE, $0F, $01, $00,
    $00, $00, $FF, $0F, $03, $00, $FC, $0F, $FD, $0F,
    $02, $00, $03, $00, $FC, $0F, $FD, $0F, $02, $00,
    $FE, $0F, $01, $00, $00, $00, $FF, $0F, $FF, $0F,
    $00, $00, $01, $00, $FE, $0F, $02, $00, $FD, $0F,
    $FC, $0F, $03, $00, $F8, $0F, $07, $00, $06, $00,
    $F9, $0F, $05, $00, $FA, $0F, $FB, $0F, $04, $00,
    $04, $00, $FB, $0F, $FA, $0F, $05, $00, $F9, $0F,
    $06, $00, $07, $00, $F8, $0F, $F8, $0F, $07, $00,
    $06, $00, $F9, $0F, $05, $00, $FA, $0F, $FB, $0F,
    $04, $00, $04, $00, $FB, $0F, $FA, $0F, $05, $00,
    $F9, $0F, $06, $00, $07, $00, $F8, $0F, $03, $00,
    $FC, $0F, $FD, $0F, $02, $00, $FE, $0F, $01, $00,
    $00, $00, $FF, $0F, $FF, $0F, $00, $00, $01, $00,
    $FE, $0F, $02, $00, $FD, $0F, $FC, $0F, $03, $00,
    $02, $00, $FD, $0F, $FC, $0F, $03, $00, $FF, $0F,
    $00, $00, $01, $00, $FE, $0F, $FE, $0F, $01, $00,
    $00, $00, $FF, $0F, $03, $00, $FC, $0F, $FD, $0F,
    $02, $00, $F9, $0F, $06, $00, $07, $00, $F8, $0F,
    $04, $00, $FB, $0F, $FA, $0F, $05, $00, $05, $00,
    $FA, $0F, $FB, $0F, $04, $00, $F8, $0F, $07, $00,
    $06, $00, $F9, $0F, $01, $00, $FE, $0F, $FF, $0F,
    $00, $00, $FC, $0F, $03, $00, $02, $00, $FD, $0F,
    $FD, $0F, $02, $00, $03, $00, $FC, $0F, $00, $00,
    $FF, $0F, $FE, $0F, $01, $00, $FA, $0F, $05, $00,
    $04, $00, $FB, $0F, $07, $00, $F8, $0F, $F9, $0F,
    $06, $00, $06, $00, $F9, $0F, $F8, $0F, $07, $00,
    $FB, $0F, $04, $00, $05, $00, $FA, $0F, $FB, $0F,
    $04, $00, $05, $00, $FA, $0F, $06, $00, $F9, $0F,
    $F8, $0F, $07, $00, $07, $00, $F8, $0F, $F9, $0F,
    $06, $00, $FA, $0F, $05, $00, $04, $00, $FB, $0F,
    $00, $00, $FF, $0F, $FE, $0F, $01, $00, $FD, $0F,
    $02, $00, $03, $00, $FC, $0F, $FC, $0F, $03, $00,
    $02, $00, $FD, $0F, $01, $00, $FE, $0F, $FF, $0F,
    $00, $00, $80, $00, $00, $00);


var
  Form1: TForm1;
  gl_boot, gl_format, gl_read: TResourceStream;
  langs: Tinifile;
  CX_Exit: boolean;

  gl_path, gl_dllfile: string;
  gl_cnndongle: ^boolean;
  hRY2: THandle;
  hToken: TPoint;
  hET99: THandle;
  shows, shows1, shows2: string;
  gl_sn1, gl_sn2, gl_cpusn: Cardinal;
  gl_QTDongle: byte;
  gl_filedata: FILE_DATA;
  gl_dwResult: integer;
  gl_dwContextNum: Longword;
  gl_pContextList: array[0..255] of ET_CONTEXT;
  gl_pCtx: PET_CONTEXT;
  gl_inbuf, gl_outbuf: array[0..$FF] of byte;
  gl_dongleSn: Dword;
  gl_QTret: Dword;
  gl_QToutBuf: array[0..255] of Char;
  gl_dgVal: array[0..$FF] of byte;
  count: integer;
  gl_flashid1, gl_flashid2, gl_flashsize: Cardinal;
  formcaption: string;


const gl_1pass = 'GuangZhou VicEasy Elec .'; //24
const gl_2pass = '3454841';
implementation

{$R *.dfm}
{$R TLDLL.RES}


function Tform1.CheckSum(data: array of byte; len: integer): integer;
var
  i, n: integer;
  eax1, ebx, ebp, val: dword;
begin
  ebx := 0;
  ebp := $204;

  for i := 0 to len - 1 do
  begin
    n := i;
    eax1 := data[i] * 2;
    val := (checkdata[ebp + eax1 - $203] shl 8) + checkdata[ebp + eax1 - $204];

    if val > 8 then
    begin
      val := word(val - (i shl 4));
    end;

    ebx := ebx xor val;
  end;
  result := ebx;
end;


function LoadFileIntoDevice(pCtx: PET_CONTEXT; lpDeviceFileID: PChar; dwDeviceFileType: Byte; lpszPCFilePath: string): boolean;
var
  dwResult: Longword;
  File1: file;
  pbBuffer: array[0..65535] of Byte;
  dwFileSize: Longword;
  dwRead: Integer;
begin
  try
    AssignFile(file1, lpszPCFilePath);
    FileMode := fmOpenRead; //在Reset之前设置FileMode为只读的,才能打开只读文件
    Reset(file1, 1);
    dwFileSize := FileSize(file1);

    if (dwFileSize = 0) then
    begin
      Result := False;
      exit;
    end;

    blockread(file1, pbbuffer, dwFileSize, dwRead);
    if (dwRead) <= 0 then
    begin
      Result := False;
      exit;
    end;

    dwResult := ETWriteFile(pCtx, lpDeviceFileID, 0, @pbBuffer, dwFileSize);
    if (dwResult <> 0) then
    begin
      Result := False;
      exit;
    end;

    result := true;
  finally
    closefile(file1);
  end;
end;

function TForm1.QT_MainEXE(cmd: byte; fileid: word; offset: Word; len: byte; indata: Pbyte; outdata: Pbyte): boolean;
var buf: array[0..$FF] of byte;
begin
  result := false;
  buf[0] := cmd;
  buf[1] := byte(fileid); //PC是低位在前
  buf[2] := fileid shr 8;
  buf[3] := byte(offset);
  buf[4] := offset shr 8; //len
  buf[5] := len;
  if len > 0 then
    move(indata^, buf[6], len);

  gl_dwResult := ETExecute(gl_pCtx, PChar('1001'), @buf, len + 6, outdata, $FF, nil);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G22', '执行狗程序出错');
    showText(clRed, shows + IntToHex(gl_dwResult, 8));
    exit;
  end;

  result := true;
end;

function kim_FileSize(s: string): integer;
var
  sr: TsearchRec;
begin
  if findfirst(expandfilename(s), faanyfile, sr) = 0 then
    result := sr.Size;
end;


function TForm1.QT_Dongle: Boolean;
var s, s1: string;
  k, i: integer;
  TokenSize: DWORD;
  datout: Dword;
  devicetype: Dword;
  OutBuf, inbuf: array[0..255] of byte;
  szAtr: array[0..MAX_ATR_LEN] of Char;
begin
  result := false;
     // 列举设备
  gl_dwContextNum := 254;
  gl_dwResult := ETEnum(@gl_pContextList, @gl_dwContextNum);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G23', '初始化齐天软件狗失败! ');
    showText(clRed, shows);
    exit;
  end;
  if gl_dwContextNum = 0 then exit; //没有找到加密狗

  sleep(20);
  gl_pCtx := @gl_pContextList[0]; //第一个狗的信息
  gl_dwResult := ETOpen(gl_pCtx);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G24', '没有找到齐天软件狗! ');
    showText(clRed, '**' + shows);
    exit;
  end;

  shows := langs.ReadString('Hint', 'G25', '已经联接到齐天软件狗! ');
  showText(clGreen, shows);


  if gl_PCtx.dwCustomer <> $830B95E1 then
  begin
    shows := langs.ReadString('Hint', 'G26', '齐天软件狗可能为定制或不兼容产品! ');
    showText(clRed, shows);
    exit;
  end;
  gl_dongleSn := gl_pCtx.bID[3] shl 24 + gl_pCtx.bID[2] shl 16 + gl_pCtx.bID[1] shl 8 + gl_pCtx.bID[0];
  sleep(20);
  gl_dwResult := ETControl(gl_pCtx, ET_GET_DEVICE_ATR, nil, 0, szAtr, MAX_ATR_LEN, @datout);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G27', '读取软件狗信息出错! ');
    showText(clRed, shows + IntToHex(gl_dwResult, 8));
    exit;
  end;

  s := inttostr((byte(szAtr[11]) shl 24) + (byte(szAtr[12]) shl 16) + (byte(szAtr[13]) shl 8) + byte(szAtr[14]));

  shows := langs.ReadString('Hint', 'G28', '齐天软件狗序列号:');
  shows1 := '   ' + langs.ReadString('Hint', 'G29', '注册信息:');
  showText(clBlue, shows + inttohex(gl_dongleSn, 8) + ' - ' + s
    + shows1 + copy(szatr, 0, 11));

  sleep(20);
  gl_dwResult := ETVerifyPin(gl_pCtx, PChar(gl_1pass), 24, ET_DEV_PIN);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G30', '软件狗主密码错误!');
    showText(clRed, shows);
    exit;
  end;
  sleep(20);
  gl_dwResult := ETVerifyPin(gl_pCtx, PChar(gl_2pass), 8, ET_USER_PIN);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G31', '软件狗次密码错误!');
    showText(clRed, shows);
    exit;
  end;
  sleep(40);
  gl_filedata.bCommand := $A2;
  gl_filedata.bDataLen := 0;
  gl_dwResult := ETExecute(gl_pCtx, PChar('1001'), @gl_filedata, gl_filedata.bDataLen + 6, @gl_OutBuf, $FF, nil);
  if gl_dwResult <> 0 then
  begin
    shows := langs.ReadString('Hint', 'G32', '执行软件狗程序出错!');
    showText(clRed, shows + IntToHex(gl_dwResult, 8));
    exit;
  end;

  s := '';
  for i := 0 to 3 do
    s := s + chr(gl_outbuf[i]);

  s1 := '';
  for i := 5 to 14 do
    s1 := s1 + chr(gl_outbuf[i]);

  shows := langs.ReadString('Hint', 'G33', '软件狗主程序版本:');
  shows1 := '  ' + langs.ReadString('Hint', 'G34', '编译日期:');
  showText(clBlue, shows + s + shows1 + s1);
  /////////////////////////
  gl_inbuf[0] := $E5;
  gl_inbuf[1] := $54;
  gl_inbuf[2] := $39;
  gl_inbuf[3] := $EF;
  gl_inbuf[4] := $AB;
  gl_inbuf[5] := $B4;
  gl_inbuf[6] := $24;
  gl_inbuf[7] := $FF;
  QT_MainEXE($A9, 0, 0, 8, @gl_inbuf, @gl_outbuf);
  gl_dgVal[0] := gl_outbuf[2];
  gl_dgVal[1] := gl_outbuf[3];
  gl_dgVal[2] := gl_outbuf[4];
  gl_dgVal[3] := gl_outbuf[5];
  gl_dgVal[4] := gl_outbuf[6];
  gl_dgVal[5] := gl_outbuf[7];
  gl_dgVal[6] := gl_outbuf[8];
  gl_dgVal[7] := gl_outbuf[9];
 ////gl_dgVal: ($3A, $DC, $E5, $37, $BB, $39, $3D, $60,

  gl_cnndongle^ := true;
  result := true;

end;

function check_pl2303(var rtcom: byte): boolean;

type TusbMinfo = record
    bLength: Byte; //0
    bDescriptorType: Byte; //1
    bcdUSB: Word; //2.3
    bDeviceClass: Byte; //4
    bDeviceSubClass: Byte; //5
    bDeviceProtocol: Byte; //6
    bMaxPacketSize0: Byte; //7
    idVendor: Word; //8.9    //067b
    idProduct: Word; //10.11 //2303
    bcdDevice: Word; //12.13
    iManufacturer: Byte; //14
    iProduct: Byte; //15
    iSerialNumber: Byte; //16
    bNumConfigurations: Byte; //17

  end;
var
  FHandle: THandle;
  usbMinfo: TusbMinfo;
  i, j, k: integer;
  nbyte: cardinal;
  ret: boolean;
  s: string;
  wbuf, rbuf: array[0..$FF] of byte;
begin
  rtcom := 0;
  result := false;

  for i := 1 to 100 do
  begin
    FHandle := CreateFile(
      PChar('\\.\COM' + inttostr(i)),
      GENERIC_READ or GENERIC_WRITE,
      FILE_SHARE_READ or FILE_SHARE_WRITE,
      nil,
      OPEN_EXISTING,
      0,
      0);
    if FHandle <> INVALID_HANDLE_VALUE then
    begin
      ret := DeviceIoControl(FHandle, // hDevice: THandle
        $222000, // dwIoControlCode: DWORD
        @wbuf, // lpInBuffer: Pointer
        $12, // nInBufferSize: DWORD
        //@rbuf, // lpOutBuffer: Pointer
        @usbMinfo,
        $12, // nOutBufferSize: DWORD
        nbyte, // var lpBytesReturned: DWORD
        nil); // lpOverlapped: POverlapped
      CloseHandle(FHandle);

      if ret and (usbMinfo.idVendor = $067B) and (usbMinfo.idProduct = $2303) then
      begin
        rtcom := i;
        result := true;
        break;
      end;
    end;
  end;

end;

function ExtractRes(ResType, ResName, ResNewName: string): boolean;
var
  Res: TResourceStream;
begin
  try
    Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
    try
      Res.SavetoFile(ResNewName);
      Result := true;
    finally
      Res.Free;
    end;
  except
    Result := false;
  end;
end;

procedure TForm1.showText(Cl: Tcolor; text: string; bold: boolean = false);
var
  i, ct, fi: integer;
  s: string;
begin
  try
    ct := form1.RichEdit1.Lines.Count - 1;
  // if ct >= 0 then //>>提示
    for fi := 0 to ct do
    begin
      s := form1.RichEdit1.Lines.Strings[fi];
      if copy(s, 1, 2) = '>>' then
        form1.RichEdit1.Lines.Strings[fi] := '  ' + copy(s, 3, length(s));
    end;

    i := form1.RichEdit1.Lines.Count + 1;
    form1.RichEdit1.SelStart := SendMessage(form1.RichEdit1.Handle,
      EM_LINEINDEX, i, 0);
    form1.RichEdit1.Perform(EM_SCROLLCARET, 0, 0); //}
    form1.RichEdit1.SelAttributes.color := cl; //color

    if bold then
      form1.RichEdit1.SelAttributes.Style := [fsbold] else
      form1.RichEdit1.SelAttributes.Style := [];

    form1.RichEdit1.Lines.Add('>>' + trim(text));
    application.ProcessMessages;
  except
    form1.RichEdit1.Lines.Add('>>***VicEasy Hint: Richedit Text error.***');
  end;

⌨️ 快捷键说明

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