?? main1.~pas
字號:
unit Main1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CPDrv,
ExtCtrls, Mask, Math;
type
TForm1 = class(TForm)
CommPortDriver1: TCommPortDriver;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
Button2: TButton;
Button3: TButton;
Entrada: TEdit;
Label4: TLabel;
Label5: TLabel;
Label3: TLabel;
Label6: TLabel;
Button4: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button5: TButton;
Label7: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure CommPortDriver1ReceiveData(Sender: TObject; DataPtr: Pointer;
DataSize: Cardinal);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure EntradaChange(Sender: TObject);
procedure EntradaKeyPress(Sender: TObject; var Key: Char);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CreateImgFile(BufSize:Integer);
function OpenImgFile : boolean;
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
offset,loop,count,incount : integer;
func_type: byte;
TempChar:Pchar;
InpFileSize,NumRead,pause:Cardinal;
FileNameSave,FileNameOpen: String;
ImageFileSave,ImageFileLoad: file;
ImageBuffer,CompareBuffer : array[0..4*1024*1024] of byte;
S_block_L , S_block_H : Byte;
s: string;
value: Array of String;
Index: Integer;
Next_Block,Page_Complete:boolean;
NumBlocks:Integer;
//------------
implementation
{$R *.DFM}
const
HexValues='0123456789ABCDEF';
function HexToInt(Hex: string): integer;
var
i: integer;
begin
Result := 0;
case Length(Hex) of
0: Result := 0;
1..8: for i:=1 to Length(Hex) do
Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
else for i:=1 to 8 do
Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
end;
end;
function HexToInt64(Hex: string): int64;
var
i: integer;
begin
Result := 0;
case Length(Hex) of
0: Result := 0;
1..16: for i:=1 to Length(Hex) do
Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
else for i:=1 to 16 do
Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var count : integer ;
Inbuf : Pchar;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=1;
Count:=0;
//incount:=1;
try CommportDriver1.sendchar(#01);
finally
end;
// Timer1.Enabled:=True;
label2.caption:='';
label6.caption:='';
end;
procedure TForm1.Button2Click(Sender: TObject);
var count : integer ;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=2;
Count:=0;
//incount:=1;
try CommportDriver1.sendchar(#02);
finally
end;
// Timer1.Enabled:=True;
label2.caption:='';
label6.caption:='';
end;
procedure TForm1.Button3Click(Sender: TObject);
//var count : integer ;
var
//S_block_L , S_block_H : Byte;
Readloop:Integer;
pause:cardinal;
//label read_block,wait;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=3;
Count:=0;
offset:=0;
S_block_L:= HexToInt(Entrada.Text) and $00ff;
S_block_H:= swap(HexToInt(Entrada.Text) and $ff00);
Index:=Incount div 64;
Setlength(value,((64 * index)+1));
if SaveDialog1.Execute then
begin
FilenameSave:=SaveDialog1.Filename;
try
begin
while count < 3 do
begin
case count of
0: CommportDriver1.sendbyte(6);
1: CommportDriver1.sendbyte(S_block_L);
2: CommportDriver1.sendbyte(S_block_H);
end;
inc(count);
end;
end;
finally;
end;
CommportDriver1.sendbyte(3);
label2.caption:='';
label6.caption:='';
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
CommPortDriver1.Connect;
func_type:=0;
Entrada.Text:='0000';
Incount:=64;
end;
procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject;
DataPtr: Pointer; DataSize: Cardinal);
var
idx:integer;
a:Extended;
begin
CommPortDriver1.PausePolling;
s := StringOfChar( #0, DataSize );
move( DataPtr^, pchar(s)^, DataSize );
Label6.Caption:= FloattoStr(DataSize);
CommPortDriver1.FlushBuffers(true,true);
case func_type of
1: begin
Loop:=1;
Setlength(value,DataSize);
While Loop < Datasize + 1 do
Begin
value[Loop-1]:=Copy(S,Loop,1);
StrPCopy(TempChar,value[Loop-1]);
Label2.Caption:=Label2.Caption+inttohex(ord(TempChar^),2);
inc(Loop);
end;
end;
2: begin
Setlength(value,DataSize);
value[0]:=Copy(S,1,1);
StrPCopy(TempChar,value[0]);
Label2.Caption:=Label2.Caption+inttohex(ord(TempChar^),2);
end;
3: begin
loop:=0;
While Loop < Datasize do
Begin
value[Loop + (64 * offset)]:=Copy(S,(Loop+1),1);
StrPCopy(TempChar,value[Loop + (64 * offset)]);
ImageBuffer[Loop + (64 * offset)]:= ord(TempChar^);
Label2.Caption:=inttohex(ord(TempChar^),2);
Label3.Caption:=inttostr(loop+ (64 * offset));
inc(Loop);
end;
inc(offset);
end;
4: begin
// loop:=0;
value[0]:=Copy(S,1,1);
// CommportDriver1.sendbyte(5);
if value[0] = chr($10) then
begin
// while loop < 64 do
// begin
CommportDriver1.sendbyte(ImageBuffer[loop + (offset *64)]);
Label2.Caption:=inttohex(ord(ImageBuffer[loop + (offset *64)]),2);
inc(loop);
// end;
if loop = 64 then
begin
inc(offset);
Loop:=0;
end;
end;
if value[0] = chr($13) then
begin
page_Complete:=true;
Loop:=0;
end
else
page_Complete:=false;
S:=' ';
end;
5: begin
value[0]:=Copy(S,1,1);
StrPCopy(TempChar,value[0]);
Label2.Caption:=inttohex(ord(TempChar^),2);
//if value[0] = chr($20) then
// begin
// Label2.Caption:='feito';
// end;
end;
end;
if ((func_type=3) and (offset < Index))
then
CommportDriver1.sendbyte(3)
else
case func_type of
3: CreateImgFile(64 * index);
end;
if ((func_type=4) and (offset < Numblocks )) then
begin
if page_complete then
begin
Page_Complete:=false;
Label7.Caption:=IntToStr(offset div 4);
CommportDriver1.sendbyte(5);
CommportDriver1.sendbyte(4);
end
else
begin
// CommportDriver1.sendbyte(4);
end;
end;
CommPortDriver1.ContinuePolling;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{ inc(count);
label3.caption:=inttostr(count);
if count = 100 then
begin
Count:=0;
label2.caption:='';
Timer1.Enabled:=False;
End; }
{ if (func_type = 3) and (offset < (incount div 64)) then
begin
CommportDriver1.sendbyte(3);
inc(offset);
Timer1.Enabled:=true;
end
else
}
{ inc(count);
if count < Incount then
CommportDriver1.sendbyte(3)
else
begin
Timer1.Enabled:=false;
Next_Block:=true;
end;}
end;
procedure TForm1.EntradaChange(Sender: TObject);
begin
incount:=(64 * HexToInt(Entrada.Text)) + 64;
Label5.caption:=inttostr(incount);
end;
procedure TForm1.EntradaKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9','a'..'f','A'..'F',#8]) then
Key := #0
end;
procedure TForm1.Button4Click(Sender: TObject);
var
Readloop:Integer;
pause:cardinal;
begin
CommPortDriver1.PollingDelay:=5;
func_type:=4;
Loop:=0;
Count:=0;
offset:=0;
page_complete:=false;
Index:=Incount div 64;
if OpenDialog1.Execute then
begin
FilenameOpen:=OpenDialog1.Filename;
if (OpenImgFile) then
begin
try
begin
while count < 3 do
begin
case count of
0: CommportDriver1.sendbyte(8); // Avisa microcontolador que armazena tamanho
1: CommportDriver1.sendbyte(S_block_L); // do arquivo a ser gravado na Flash
2: CommportDriver1.sendbyte(S_block_H);
end;
inc(count);
end;
CommportDriver1.sendbyte(7); // Seta modo Page Program
CommportDriver1.sendbyte(5);
CommportDriver1.sendbyte(4);
end;
finally;
end;
label2.caption:='';
label6.caption:='';
end;
end;
end;
Procedure Tform1.CreateImgFile(BufSize:Integer);
begin
AssignFile(ImageFileSave,FileNameSave); { Open output file }
{$I-}
Rewrite(ImageFileSave, 1);
{$I+}
if IOResult = 0 then
begin
BlockWrite(ImageFileSave, ImageBuffer, BufSize);
CloseFile(ImageFileSave);
End
else
MessageDlg('N鉶 pude gravar o arquivo !', mtWarning, [mbOk], 0);
end;
function TForm1.OpenImgFile : boolean;
var
rslt: Boolean;
L: Cardinal;
begin
rslt:= False;
AssignFile(ImageFileLoad,FileNameOpen); { Open output file }
{I-}
Reset(ImageFileLoad,1);
{I+}
if IOResult = 0 then
begin
InpFileSize:=FileSize(ImageFileLoad);
Numblocks:= InpFileSize div 64;
if InpFileSize mod 64 <> 0 then Numblocks := Numblocks + 1;
S_block_L:= Numblocks and $00ff;
S_block_H:= swap(Numblocks) and $ff00 ;
Fillchar(ImageBuffer,4*1024*1024,$FF);
BlockRead(ImageFileLoad, ImageBuffer,InpFileSize,NumRead);
rslt:=true;
CloseFile(ImageFileLoad);
end
else
MessageDlg('N鉶 pude ler o arquivo !', mtWarning, [mbOk], 0);
OpenImgFile:=Rslt;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
New(TempChar);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Dispose(TempChar);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
func_type:=5;
CommPortDriver1.PollingDelay:=100;
CommportDriver1.sendbyte($c);
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -