小女子刚接触SPCOMM,现在要做一个下载工具,不知道如何实现,请教各位大侠,急救,谢谢各位
如何利用SPCOMM读取BIN文件下载至串口,要求,先发送一个字节,等待串口回答后,再发送文件长度和文件前三个字节,等待串口回答后,方可发送文件剩余内容(发送一个字节A,等待串口返回应答A)
读取文件后,是将读到的文件内容存在一个数组中后来发送,还是读一段发送一段呢,怎么实现?
如何利用SPCOMM读取BIN文件下载至串口,要求,先发送一个字节,等待串口回答后,再发送文件长度和文件前三个字节,等待串口回答后,方可发送文件剩余内容(发送一个字节A,等待串口返回应答A)
读取文件后,是将读到的文件内容存在一个数组中后来发送,还是读一段发送一段呢,怎么实现?
解决方案 »
- 关于DBXpress和TTransactionDesc
- 头疼!Delphi调用C#的应用程序无效
- DELPHI 7.0的IDE里面有打包安装的工具吧??就象VS.NET2003一样,里面有制作安装的工具包??
- 请教一个delphi控制word的问题?
- SSL 在Delphi 7中如何使用??那位有相关的实例?
- 小弟初学,请问怎么实现点击treeview根目录上的+号时,不要让它的子目录展开,当满足一定条件时再让它展开。
- 怎么样把query返回的结果存储成文本文件!??在线等待!!!!
- 用formula one6.0实现很复杂的报表,大家看看,只要有帮助就人人给分100!决不食言!
- win7下SQLOLEDB的问题
- 调查一下:有多少程序员买楼了?
- 如何实现以下的字符串操作:
- 不能当FORM2关掉后自动按某键吗?
用Stream加载文件,然后用SendBuffer(或类似的)来发送,Stream有Memory属性和Size属性,刚好给SendBuffer来用。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,StrUtils, ExtCtrls, SPComm;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
ProgressBar1: TProgressBar;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Memo2: TMemo;
Button2: TButton;
Timer1: TTimer;
Comm1: TComm;
ComboBox1: TComboBox;
Label2: TLabel;
Button3: TButton;
ProgressBar2: TProgressBar;
procedure FormClose(Sender:Tobject;var Action:TCloseAction);
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
private
{ Private declarations }
public
{ Public declarations }
end;var
fs:integer;
F:file;
LenF:longint;
Form1: TForm1;
sbuf:array of byte;
rbuf:array[0..1024] of byte;
commflg:boolean;
function ReadFile0(FileName:String):boolean;implementation{$R *.dfm}//读取文件函数function ReadFile0(FileName:String):boolean;
var
//F:File;
Src:Array[0..1024-1] of byte;
viewstring:string;
viewstring1:string;
i,j,numread:Integer;
p:integer;
LenFH,LenFL:longint;
begin
result:=True;
if not FileExists(FileName) then
begin
result:=false;
exit;
end;
AssignFile(F,FileName);
Reset(F,1);
p:=filesize(F);
LenF:=filesize(F);
setlength(sbuf,LenF);
if LenF>256 then
begin
LenFH:=LenF div 256;
LenFL:=LenF-256*LenFH;
end
else
begin
LenFH:=$00;
LenFL:=LenF;
end;
sbuf[0]:=$EB;//帧头
sbuf[1]:=LenFH;
sbuf[2]:=LenFL;
if P < sizeof(Src) then
begin //Test
CloseFile(f);
showmessage('文件大小错误');
exit;
end
else numread:= sizeof(Src)-1;
fs:=0;
commflg:=true;
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin
commflg:=false;
sleep(2);
end;
if not commflg then MessageDlg('发送失败!',mterror,[mbyes],0)
else
begin
viewstring1:='';
viewstring1:=inttohex(sbuf[fs],2)+' ';
form1.Memo2.Lines.Add(viewstring1);
inc(fs);
end;
j:=3;
repeat
viewstring:='';
BlockRead(F,Src,sizeof(src),numread);
if numread>0 then
begin
form1.ProgressBar1.Position:=0;
form1.ProgressBar1.Max:=numread;
for p:=0 to numread-1 do
begin
viewstring:=viewstring+inttohex(Src[p],2)+' ';
form1.ProgressBar1.position:=form1.ProgressBar1.position+1;
Application.ProcessMessages;
end;
form1.Memo1.Lines.Add(viewstring);
for i:=0 to numread-1 do
begin
sbuf[j]:=Src[i];
inc(j);
Application.ProcessMessages;
end;
end;
until ((NumRead=0) and (form1.ProgressBar1.Position<=form1.ProgressBar1.Max));
Application.ProcessMessages;
CloseFile(F);
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
form1.Comm1.CommName:=form1.ComboBox1.Text;
end;
//关闭串口
procedure TForm1.FormClose(Sender:TObject;var Action:TCloseAction);
begin
form1.comm1.StopComm;//关闭窗体时,将comm1控件关闭
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Comm1.CommName:=form1.ComboBox1.Text;
form1.Comm1.BaudRate:=38400;
form1.Comm1.Parity:=None;
form1.Comm1.ByteSize:=_8;
form1.Comm1.StopBits:=_1;
form1.comm1.StartComm;
sleep(2);
memo1.Clear;
memo2.Clear;
if (OpenDialog1.Execute) and (Opendialog1.FileName<>'' )then
begin
form1.Edit1.Text:=Opendialog1.FileName;
ReadFile0(Opendialog1.FileName);
end;
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,k:integer;
r:array[0..1024]of byte;
viewstring2:string;
begin
move(buffer^,r,bufferlength);
rbuf[0]:=r[0];
if (fs=1) and (rbuf[0]=$EB) then
begin
for i:=1 to 5 do
begin
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end
else
begin
viewstring2:=inttohex(sbuf[fs],2)+' '+viewstring2;
inc(fs);
end;
form1.Memo2.Lines.Add(viewstring2);
sleep(2);
end;
end;
if (fs=6) and (rbuf[0]=$55) then
begin
if not form1.Comm1.WriteCommData(@sbuf[fs],1)then
begin commflg:=false; sleep(2); end;
inc(fs);
sleep(2);
end;
while fs<=LenF+2 do
begin
k:=fs;
for k:=7 to LenF+2 do
begin
if rbuf[0]=sbuf[k-1] then
begin
viewstring2:='';
if not form1.Comm1.WriteCommData(@sbuf[k],1)then
begin commflg:=false; sleep(2); end
else
begin
viewstring2:=inttohex(sbuf[k],2)+'';
form1.Memo2.Lines.Strings[Memo2.Lines.Count-1]:=
form1.Memo2.Lines.Strings[Memo2.Lines.Count-1]+viewstring2;
end;
sleep(2);
end;
end;
end;
if fs=LenF+2 then form1.Memo2.Lines.Add('下载成功');
form1.ProgressBar2.Max:=LenF+2;
form1.ProgressBar2.Step:=1;
form1.ProgressBar2.Position:=0;
if not eof(F) then form1.ProgressBar2.Position:=fs;
Application.ProcessMessages;
end;
end.
代码太长,没时间看,根据你描述的情况,试着加载FastMM4,去分析一下出错的部分在哪里?FastMM4的下载及用法,可以自己去Google上搜搜。