现在公司要求我做一个升级软件,要求把一个BIN文件里的内容发给串口,每一次都要求发1024个字节,如果说少于1024个字节的话,就按照实际的数据来发(读取出来的实际字节数内容来发),每发一次(成功数据)它的硬件都会返回一个数据给我表示成功,这个程序应该怎么写呢?
procedure TForm1.BitBtn3Click(Sender: TObject);
var hzkstrr:string;    
   hzkstream:TFileStream;
begin
 if not(OpenDialog1.Execute) then exit;
 hzkStream.Free;
 hzkStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
 SetLength(hzkstr,256);//设置读取缓冲区大小
 hzkstream.Position:=0;//读取起始位置
 txlen:=hzkStream.Read(hzkstr[1],256);//数据读到HZKSTR中,TXLEN=实际读取长度
 Comm1.WriteCommData(PAnsiChar(hzkstr),txlen);
 hzkStream.Free;
end;
上面的代码我不知道怎么循环读取数据发送,且什么时候结束.
希望高手多多指教,谢谢!!!!

解决方案 »

  1.   

    变量声明部分搞错了
    代码如下:
    var 
    hzkstr:string;    
    hzkstream:TFileStream;
    TXLEN:integer;
      

  2.   

    不是出错了,关键是不知道怎么样来写这个程序.
    我想把文件读取出来到MEMO中,然后再来处理
      

  3.   

    是不是,怎样判断文件结束的问题?
    procedure TForm1.BitBtn3Click(Sender: TObject); 
    var hzkstrr:string;    
       hzkstream:TFileStream; 
    begin 
      if not(OpenDialog1.Execute) then exit; 
      hzkStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); 
      SetLength(hzkstr,256);//设置读取缓冲区大小 
      hzkstream.Position:=0;//读取起始位置 
      repeat
        txlen:=hzkStream.Read(hzkstr[1],256);//数据读到HZKSTR中,TXLEN=实际读取长度 
        Comm1.WriteCommData(PAnsiChar(hzkstr),txlen);
      until  hzkStream.position >=hzkStream.size;
      hzkStream.Free; 
    end; 
      

  4.   

    var
      fromf,tof:file;
      numread,numwrite,i:integer;
      buf:array[1..1024] of char;
    begin
    str1:='';
      if opendialog1.Execute then
      begin
        assignfile(fromf,opendialog1.FileName);
        reset(fromf,1);
        if savedialog1.Execute then
        begin
          assignfile(tof,savedialog1.FileName);
          rewrite(tof,1);
          canvas.TextOut(10,10,'copying'+inttostr(filesize(fromf))+'bytess...');
          repeat
            blockread(fromf,buf,sizeof(buf),numread);
        memo1.Lines.Add(buf);
        until (numread=0);
        closefile(fromf);
        end;
      end;
    end;
    这个代码可以把BIN文件里面的内容读取出来(读取出来的好像是ASC码),但是现在有一个问题就是怎么把BUF里面内容转换成HEX
      

  5.   

    把char定义成byte就行了
    要显示到memo里format一下就是了
    var
    ....
    ....
    buf:array[1..1024] of byte; 
    strhex:string;
    i:integer;
    begin
    ....
    ....
      strhex:='';
      for i:=low(buf) to high(buf) do
      begin
        strhex:=strhex+format('%.2x ',[buf[i]]);//转换成16进制
      end;
      memo1.Lines.Add(strhex);
    ....
    ....
    end;