小女子刚接触SPCOMM,现在要做一个下载工具,不知道如何实现,请教各位大侠,急救,谢谢各位
如何利用SPCOMM读取BIN文件下载至串口,要求,先发送一个字节,等待串口回答后,再发送文件长度和文件前三个字节,等待串口回答后,方可发送文件剩余内容(发送一个字节A,等待串口返回应答A)
读取文件后,是将读到的文件内容存在一个数组中后来发送,还是读一段发送一段呢,怎么实现?

解决方案 »

  1.   

    SPCOMM本身不是有接收事件,和发送函数吗,一应一答,先发,然后接收,符合规定继续发
      

  2.   


    用Stream加载文件,然后用SendBuffer(或类似的)来发送,Stream有Memory属性和Size属性,刚好给SendBuffer来用。
      

  3.   

    我有个程序,一到关闭文件就出错,提示我指针错误,可是都没有使用,可能是文件的使用,请教各位大侠
    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.
      

  4.   


    代码太长,没时间看,根据你描述的情况,试着加载FastMM4,去分析一下出错的部分在哪里?FastMM4的下载及用法,可以自己去Google上搜搜。