EEPROM_form.pas
Upload User: yanshikc
Upload Date: 2013-08-21
Package Size: 407k
Code Size: 16k
Development Platform:

MultiPlatform

  1. {-----------------------------------------------------------------------------
  2.  Unit Name:  Unit1
  3.  Author :    A1.Aleyn.wu
  4.  E-mail :    Aleyn@e-midas.cn
  5.  QQ/Group:   2282902/7617215
  6.  Purpose:
  7.  History:    v1.0
  8. -----------------------------------------------------------------------------}
  9. unit EEPROM_form;
  10. interface
  11. uses
  12.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  13.   Dialogs, Grids, DB, DBGrids, StdCtrls, DBClient, ExtCtrls, ToolWin,
  14.   ComCtrls, CPort, ActnList, CPortCtl, HMRegistry;
  15. type
  16.   TForm1 = class(TForm)
  17.     DataSource1: TDataSource;
  18.     cdsAVR: TClientDataSet;
  19.     cdsAVRF1: TStringField;
  20.     cdsAVRF2: TStringField;
  21.     cdsAVRF3: TStringField;
  22.     cdsAVRF4: TStringField;
  23.     cdsAVRF5: TStringField;
  24.     cdsAVRF6: TStringField;
  25.     cdsAVRF7: TStringField;
  26.     cdsAVRF8: TStringField;
  27.     cdsAVRF9: TStringField;
  28.     cdsAVRFA: TStringField;
  29.     cdsAVRFB: TStringField;
  30.     cdsAVRFC: TStringField;
  31.     cdsAVRFD: TStringField;
  32.     cdsAVRFE: TStringField;
  33.     cdsAVRFF: TStringField;
  34.     cdsAVRFS: TStringField;
  35.     ToolBar1: TToolBar;
  36.     ActionList1: TActionList;
  37.     actHelp: TAction;
  38.     actRead: TAction;
  39.     actWrite: TAction;
  40.     actExit: TAction;
  41.     ToolButton1: TToolButton;
  42.     ToolButton2: TToolButton;
  43.     ToolButton3: TToolButton;
  44.     ToolButton4: TToolButton;
  45.     actStart: TAction;
  46.     actStop: TAction;
  47.     ToolButton5: TToolButton;
  48.     ToolButton6: TToolButton;
  49.     ToolButton7: TToolButton;
  50.     ToolButton8: TToolButton;
  51.     ToolButton9: TToolButton;
  52.     cdsAVRF0: TStringField;
  53.     cdsAVRFI: TStringField;
  54.     prs: TProgressBar;
  55.     ToolButton10: TToolButton;
  56.     ToolButton11: TToolButton;
  57.     ToolButton12: TToolButton;
  58.     actOpen: TAction;
  59.     actSave: TAction;
  60.     ToolButton13: TToolButton;
  61.     cdsImport: TClientDataSet;
  62.     OpenDialog1: TOpenDialog;
  63.     SaveDialog1: TSaveDialog;
  64.     Panel1: TPanel;
  65.     DBGrid1: TDBGrid;
  66.     Splitter1: TSplitter;
  67.     Memo1: TMemo;
  68.     Panel2: TPanel;
  69.     Splitter2: TSplitter;
  70.     GroupBox1: TGroupBox;
  71.     opnAddr1: TRadioButton;
  72.     opnAddr2: TRadioButton;
  73.     GroupBox2: TGroupBox;
  74.     ra2: TCheckBox;
  75.     ra1: TCheckBox;
  76.     ra0: TCheckBox;
  77.     Label1: TLabel;
  78.     Label2: TLabel;
  79.     Label3: TLabel;
  80.     Label4: TLabel;
  81.     wa2: TCheckBox;
  82.     wa1: TCheckBox;
  83.     wa0: TCheckBox;
  84.     Label5: TLabel;
  85.     ComPort1: TComPort;
  86.     GroupBox3: TGroupBox;
  87.     ComLed1: TComLed;
  88.     ComLed3: TComLed;
  89.     ComLed4: TComLed;
  90.     ComLed5: TComLed;
  91.     Label6: TLabel;
  92.     Label7: TLabel;
  93.     Label8: TLabel;
  94.     Label9: TLabel;
  95.     Label10: TLabel;
  96.     Label11: TLabel;
  97.     cmbPort: TComComboBox;
  98.     cmbRate: TComComboBox;
  99.     cmbData: TComComboBox;
  100.     cmbFlow: TComComboBox;
  101.     cmbParity: TComComboBox;
  102.     cmbStop: TComComboBox;
  103.     Label12: TLabel;
  104.     Label13: TLabel;
  105.     Label14: TLabel;
  106.     Label15: TLabel;
  107.     btnUpdate: TButton;
  108.     Reg: THMRegistry;
  109.     procedure actHelpExecute(Sender: TObject);
  110.     procedure actStartExecute(Sender: TObject);
  111.     procedure actStopExecute(Sender: TObject);
  112.     procedure FormCreate(Sender: TObject);
  113.     procedure actReadExecute(Sender: TObject);
  114.     procedure FormDestroy(Sender: TObject);
  115.     procedure actExitExecute(Sender: TObject);
  116.     procedure actWriteExecute(Sender: TObject);
  117.     procedure actOpenExecute(Sender: TObject);
  118.     procedure actSaveExecute(Sender: TObject);
  119.     procedure cdsAVRBeforePost(DataSet: TDataSet);
  120.     procedure ComPort1RxChar(Sender: TObject; Count: Integer);
  121.     procedure btnUpdateClick(Sender: TObject);
  122.   private
  123.     FBuffer: PChar;
  124.     FBufIdx: integer;
  125.     SBuffer: PChar;
  126.   public
  127.     procedure OpenPort;
  128.     procedure ClosePort;
  129.     procedure WritePort(Buffer: Pointer; Count: Integer);
  130.     procedure PressBuffer(Buffer: Pointer; BufferLength: Integer);
  131.   end;
  132. type
  133.   TWriteCommThread = class(TThread)
  134.   private
  135.     FAddrType: integer;
  136.     procedure SetAddrType(const Value: integer);
  137.   protected
  138.     procedure Execute; override;
  139.   public
  140.     property AddrType: integer read FAddrType write SetAddrType;
  141.   end;
  142. const
  143.   CMDBEGIN = #27;
  144.   CMDEND = #28;
  145.   CMDHELP = #72;
  146.   CMDREAD = #82;
  147.   CMDWRITE = #87;
  148. var
  149.   Form1: TForm1;
  150.   VaildWrite: PChar;
  151.   WriteResult: Boolean;
  152. implementation
  153. {$R *.dfm}
  154. const
  155.   Convert: array[0..15] of Char = '0123456789ABCDEF';
  156. procedure TForm1.FormCreate(Sender: TObject);
  157. begin
  158.   Reg.OpenKey;
  159.   if Reg.ValueExists('Port') then cmbPort.Text := Reg.SValue['Port'];
  160.   if Reg.ValueExists('Rate') then cmbRate.Text := Reg.SValue['Rate'];
  161.   if Reg.ValueExists('Data') then cmbData.Text := Reg.SValue['Data'];
  162.   if Reg.ValueExists('Flow') then cmbFlow.Text := Reg.SValue['Flow'];
  163.   if Reg.ValueExists('Parity') then cmbParity.Text := Reg.SValue['Parity'];
  164.   if Reg.ValueExists('Stop') then cmbStop.Text := Reg.SValue['Stop'];
  165.   Reg.CloseKey;
  166.   btnUpdateClick(Sender);
  167.   GetMem(FBuffer, 4096);
  168.   GetMem(SBuffer, 4096);
  169.   GetMem(VaildWrite, 3);
  170.   cdsAVR.LoadFromFile('HexTable.cds');
  171.   cdsAVR.Open;
  172. end;
  173. procedure TForm1.FormDestroy(Sender: TObject);
  174. begin
  175.   Reg.OpenKey;
  176.   Reg.SValue['Port'] := cmbPort.Text;
  177.   Reg.SValue['Rate'] := cmbRate.Text;
  178.   Reg.SValue['Data'] := cmbData.Text;
  179.   Reg.SValue['Flow'] := cmbFlow.Text;
  180.   Reg.SValue['Parity'] := cmbParity.Text;
  181.   Reg.SValue['Stop'] := cmbStop.Text;
  182.   FreeMem(FBuffer);
  183.   FreeMem(SBuffer);
  184.   FreeMem(VaildWrite);
  185.   FBufIdx := 0;
  186. end;
  187. procedure TForm1.actHelpExecute(Sender: TObject);
  188. var
  189.   Buffer: PChar;
  190. begin
  191.   GetMem(Buffer, 32); //命令缓冲区
  192.   try
  193.     Buffer[0] := CMDBEGIN; //命令开始符
  194.     Buffer[1] := CMDHELP; //标志这条命令是要求AVR发送HELP给PC
  195.     Buffer[2] := CMDEND; //命令结束符
  196.     //ComPort1.Write(Buffer, 4);
  197.     WritePort(Buffer, 4); //从串口发出命令
  198.     Sleep(100); //等待 100ms,此间AVR会发回信息
  199.   finally
  200.     FreeMem(Buffer);
  201.   end;
  202. end;
  203. procedure TForm1.actStartExecute(Sender: TObject);
  204. begin
  205.   OpenPort;
  206.   actStart.Enabled := False;
  207.   actStop.Enabled := True;
  208. end;
  209. procedure TForm1.actStopExecute(Sender: TObject);
  210. begin
  211.   ClosePort;
  212.   actStart.Enabled := True;
  213.   actStop.Enabled := False;
  214. end;
  215. procedure TForm1.actReadExecute(Sender: TObject);
  216. var
  217.   Buffer: PChar;
  218.   Buf2: array[1..2] of Byte;
  219. begin
  220.   GetMem(Buffer, 32);
  221.   try
  222.     Buffer[0] := CMDBEGIN;
  223.     Buffer[1] := CMDREAD;
  224.     if opnAddr1.Checked then
  225.       Buf2[1] := 1
  226.     else
  227.       Buf2[1] := 2;
  228.     Buf2[2] := 0;
  229.     if ra0.Checked then Buf2[2] := Buf2[2] + 2;
  230.     if ra1.Checked then Buf2[2] := Buf2[2] + 4;
  231.     if ra2.Checked then Buf2[2] := Buf2[2] + 8;
  232.     BinToHex(@Buf2[1], @Buffer[2], 2); //Memory Address Type and Chip Address
  233.     Buf2[1] := $00;
  234.     Buf2[2] := $00;
  235.     BinToHex(@Buf2[1], @Buffer[6], 2); //Memory Address
  236.     Buf2[1] := $01;
  237.     Buf2[2] := $FF;
  238.     BinToHex(@Buf2[1], @Buffer[10], 2); //Read Count
  239.     Buffer[14] := CMDEND;
  240.     //Comm1.WriteCommData(Buffer, 15);
  241.     WritePort(Buffer, 15);
  242.   finally
  243.     FreeMem(Buffer);
  244.   end;
  245. end;
  246. procedure TForm1.PressBuffer(Buffer: Pointer; BufferLength: Integer);
  247. var
  248.   Buf2: pchar;
  249.   i: integer;
  250.   pos, pos2: integer;
  251.   s: string;
  252. begin
  253.   if BufferLength > 0 then
  254.     begin
  255.       if (PChar(Buffer)[0] = CMDBEGIN) then FBufIdx := 0;
  256.       if (BufferLength + FBufIdx >= 4096) then BufferLength := 4096 - FBufIdx - 1;
  257.       CopyMemory(@FBuffer[FBufIdx], Buffer, BufferLength);
  258.       Inc(FBufIdx, BufferLength);
  259.       //Memo2.Text:=StrPas(FBuffer);
  260.       if (PChar(Buffer)[BufferLength - 1]) <> CMDEND then exit;
  261.     end;
  262.   if (FBufIdx <= 3) then exit;
  263.   if (FBuffer[1] = CMDHELP) then
  264.     begin
  265.       GetMem(Buf2, FBufIdx - 2);
  266.       try
  267.         CopyMemory(Buf2, @FBuffer[2], FBufIdx - 3);
  268.         for i := 1 to FBufIdx - 3 do
  269.           if (Buf2[i - 1] < #32) and not (Buf2[i - 1] in [#10, #13]) then
  270.             Buf2[i - 1] := #32;
  271.         Buf2[FBufIdx - 3] := #0;
  272.         Memo1.Lines.Text := StrPas(Buf2);
  273.         FBufIdx := 0;
  274.         FillMemory(FBuffer, 4096, 0);
  275.       finally
  276.         FreeMem(Buf2);
  277.       end;
  278.     end
  279.   else if (FBuffer[1] = CMDREAD) then
  280.     begin
  281.       GetMem(Buf2, FBufIdx - 2);
  282.       SetLength(s, 2);
  283.       try
  284.         CopyMemory(Buf2, @FBuffer[2], FBufIdx - 3);
  285.         Buf2[FBufIdx - 3] := #0;
  286.         //Memo1.Lines.Add(StrPas(Buf2));
  287.         if cdsAVR.ChangeCount > 0 then cdsAVR.CancelUpdates;
  288.         pos := 1;
  289.         Pos2 := 0;
  290.         prs.Max := 256;
  291.         prs.Min := 0;
  292.         prs.Position := 0;
  293.         prs.Visible := True;
  294.         cdsAVR.FieldByName('FI').ReadOnly := False;
  295.         for i := 1 to FBufIdx - 3 do
  296.           begin
  297.             if (Buf2[i - 1] <> #32) then
  298.               begin
  299.                 if (pos <= 2) then s[Pos] := Buf2[i - 1];
  300.                 Inc(Pos);
  301.               end
  302.             else
  303.               begin
  304.                 Pos := 1;
  305.                 if (pos2 = 0) then
  306.                   cdsAVR.Append;
  307.                 cdsAVR['F' + Convert[pos2]] := s;
  308.                 Inc(pos2);
  309.                 prs.StepIt;
  310.                 if pos2 >= 16 then
  311.                   begin
  312.                     if cdsAVR.RecordCount < 16 then
  313.                       cdsAVR['FI'] := Convert[cdsAVR.RecordCount] + '0:' + Convert[cdsAVR.RecordCount] + Convert[pos2 - 1];
  314.                     Pos2 := 0;
  315.                     cdsAVR.Post;
  316.                   end;
  317.               end;
  318.           end;
  319.         if cdsAVR.Modified then
  320.           begin
  321.             if cdsAVR.RecordCount < 16 then
  322.               cdsAVR['FI'] := Convert[cdsAVR.RecordCount] + '0:' + Convert[cdsAVR.RecordCount] + Convert[pos2 - 1];
  323.             cdsAVR.Post;
  324.           end;
  325.         cdsAVR.First;
  326.         cdsAVR.FieldByName('FI').ReadOnly := True;
  327.       finally
  328.         FreeMem(Buf2);
  329.         prs.Visible := False;
  330.       end;
  331.     end
  332.   else if (FBuffer[1] = CMDWRITE) then
  333.     begin
  334.       CopyMemory(VaildWrite, @FBuffer[2], 2);
  335.       WriteResult := True;
  336.     end;
  337. end;
  338. procedure TForm1.actExitExecute(Sender: TObject);
  339. begin
  340.   Close;
  341. end;
  342. { TWriteCommThread }
  343. procedure TWriteCommThread.Execute;
  344. var
  345.   Buffer: PChar;
  346.   Buf2: array[1..2] of Byte;
  347.   s: string;
  348.   Pos: integer;
  349.   wait: integer;
  350. begin
  351.   with Form1 do
  352.     if cdsAVR.Active and (cdsAVR.RecordCount > 0) then
  353.       begin
  354.         if cdsAVR.Modified then cdsAVR.Post;
  355.         cdsAVR.First;
  356.         Pos := 0;
  357.         GetMem(Buffer, 32);
  358.         cdsAVR.DisableControls;
  359.         try
  360.           //SetLength(s, 2);
  361.           prs.Max := cdsAVR.RecordCount * 16;
  362.           prs.Min := 0;
  363.           prs.Position := 0;
  364.           prs.Visible := True;
  365.           Buffer[0] := CMDBEGIN;
  366.           Buffer[1] := CMDWRITE;
  367.           if opnAddr1.Checked then
  368.             Buf2[1] := 1
  369.           else
  370.             Buf2[1] := 2;
  371.           Buf2[2] := 0;
  372.           if wa0.Checked then Buf2[2] := Buf2[2] + 2;
  373.           if wa1.Checked then Buf2[2] := Buf2[2] + 4;
  374.           if wa2.Checked then Buf2[2] := Buf2[2] + 8;
  375.           BinToHex(@Buf2[1], @Buffer[2], 2); //Memory Address Type and Chip Address
  376.           while not cdsAVR.Eof and (cdsAVR.RecNo <= 16) and not Self.Terminated and not Application.Terminated do
  377.             begin
  378.               if not cdsAVR.FieldByName('F' + Convert[Pos]).IsNull and
  379.                 (Length(cdsAVR.FieldByName('F' + Convert[Pos]).AsString) = 2) then
  380.                 begin
  381.                   s := UpperCase(cdsAVR.FieldByName('F' + Convert[Pos]).AsString);
  382.                   if not (s[1] in ['0'..'9', 'A'..'F']) then s[1] := '0';
  383.                   if not (s[2] in ['0'..'9', 'A'..'F']) then s[2] := '0';
  384.                   //Memory Address
  385.                   Buffer[6] := '0';
  386.                   Buffer[7] := '0';
  387.                   Buffer[8] := Convert[cdsAVR.Recno - 1];
  388.                   Buffer[9] := Convert[Pos];
  389.                   //Memory Data
  390.                   Buffer[10] := s[1];
  391.                   Buffer[11] := s[2];
  392.                   Buffer[12] := CMDEND;
  393.                   WriteResult := False;
  394.                   FillMemory(VaildWrite, 3, 0);
  395.                   wait := 0;
  396.                   WritePort(Buffer, 13);
  397.                   while (wait < 2000) and (not WriteResult) do
  398.                     begin
  399.                       Inc(wait);
  400.                       Sleep(100);
  401.                     end;
  402.                   if wait >= 2000 then
  403.                     begin
  404.                       Memo1.Lines.Add('Write EEPROM Error(Time out).');
  405.                       Break;
  406.                     end;
  407.                   if WriteResult and (s[1] <> VaildWrite[0]) and (s[2] <> VaildWrite[1]) then
  408.                     begin
  409.                       Buffer[12] := #0;
  410.                       Memo1.Lines.Add('Write EEPROM Error(Vaild Check Data:' + StrPas(@Buffer[2]) + ',S:' + s + ',Result:' + StrPas(VaildWrite) + ')');
  411.                     end;
  412.                 end;
  413.               Inc(Pos);
  414.               prs.StepIt;
  415.               if Pos >= 16 then
  416.                 begin
  417.                   Pos := 0;
  418.                   cdsAVR.Next;
  419.                 end;
  420.             end;
  421.           cdsAVR.First;
  422.         finally
  423.           FreeMem(Buffer);
  424.           cdsAVR.EnableControls;
  425.           prs.Visible := False;
  426.         end;
  427.       end;
  428. end;
  429. procedure TForm1.actWriteExecute(Sender: TObject);
  430. begin
  431.   TWriteCommThread.Create(False);
  432. end;
  433. procedure TForm1.actOpenExecute(Sender: TObject);
  434. var i: integer;
  435.   Field: TField;
  436. begin
  437.   if OpenDialog1.Execute then
  438.     begin
  439.       cdsImport.LoadFromFile(OpenDialog1.FileName);
  440.       cdsImport.Open;
  441.       cdsImport.First;
  442.       if (cdsAVR.ChangeCount > 0) then cdsAVR.CancelUpdates;
  443.       cdsAVRFI.ReadOnly := False;
  444.       while not cdsImport.Eof do
  445.         begin
  446.           cdsAVR.Append;
  447.           for i := 1 to cdsAVR.FieldCount do
  448.             begin
  449.               Field := cdsImport.FindField(cdsAVR.Fields[i - 1].FieldName);
  450.               if (Field <> nil) and cdsAVR.Fields[i - 1].CanModify then
  451.                 begin
  452.                   cdsAVR.Fields[i - 1].Value := Field.Value;
  453.                 end;
  454.             end;
  455.           cdsAVR.Post;
  456.           cdsImport.Next;
  457.         end;
  458.       cdsImport.Close;
  459.       cdsAVRFI.ReadOnly := True;
  460.       cdsAVR.First;
  461.       //cdsImport.EmptyDataSet;
  462.     end;
  463. end;
  464. procedure TForm1.actSaveExecute(Sender: TObject);
  465. begin
  466.   if cdsAVR.Active and SaveDialog1.Execute then
  467.     begin
  468.       cdsAVR.SaveToFile(SaveDialog1.FileName);
  469.     end;
  470. end;
  471. procedure TWriteCommThread.SetAddrType(const Value: integer);
  472. begin
  473.   FAddrType := Value;
  474. end;
  475. procedure TForm1.cdsAVRBeforePost(DataSet: TDataSet);
  476. var
  477.   i: integer;
  478.   s: string;
  479. begin
  480.   for i := 1 to 16 do
  481.     begin
  482.       s := cdsAVR.FieldByName('F' + Convert[i - 1]).AsString;
  483.       if s = '' then s := '00';
  484.       if (s[1] in ['a'..'f']) then s[1] := Char(Byte(s[1]) - 32);
  485.       if (s[2] in ['a'..'f']) then s[2] := Char(Byte(s[2]) - 32);
  486.       if not (s[1] in ['0'..'9', 'A'..'F']) then s[1] := '0';
  487.       if not (s[2] in ['0'..'9', 'A'..'F']) then s[2] := '0';
  488.       if s <> cdsAVR.FieldByName('F' + Convert[i - 1]).AsString then
  489.         begin
  490.           //if not (cdsAVR.State in [dsEdit, dsInsert]) then cdsAVR.Edit;
  491.           cdsAVR.FieldByName('F' + Convert[i - 1]).AsString := s;
  492.         end;
  493.     end;
  494. end;
  495. procedure TForm1.WritePort(Buffer: Pointer; Count: Integer);
  496. begin
  497.   ComPort1.Write(Buffer^, Count);
  498. end;
  499. procedure TForm1.OpenPort;
  500. begin
  501.   ComPort1.Open;
  502. end;
  503. procedure TForm1.ClosePort;
  504. begin
  505.   ComPort1.Close;
  506. end;
  507. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  508. var i: integer;
  509. begin
  510.   if Count <= 0 then exit;
  511.   if Count < 4096 then
  512.     begin
  513.       ComPort1.Read(SBuffer^, Count);
  514.       PressBuffer(SBuffer, Count);
  515.     end
  516.   else
  517.     begin
  518.       i := Count;
  519.       while i > 0 do
  520.         begin
  521.           ComPort1.Read(SBuffer^, 4096);
  522.           PressBuffer(SBuffer, 4096);
  523.           i := i - 4096;
  524.         end;
  525.     end;
  526. end;
  527. procedure TForm1.btnUpdateClick(Sender: TObject);
  528. begin
  529.   cmbPort.ApplySettings;
  530.   cmbPort.UpdateSettings;
  531.   cmbRate.ApplySettings;
  532.   cmbData.ApplySettings;
  533.   cmbFlow.ApplySettings;
  534.   cmbParity.ApplySettings;
  535.   cmbStop.ApplySettings;
  536. end;
  537. end.