我使用Delphi Comport411f组件,我需要将二进制文件读取到流中,然后需要以4096字节块的形式将流发送到Comport,并在写入每个块后从Comport中读取。

我的问题是我的代码正在写入整个文件,然后才读取Comport答案。每写入4096个块后,我需要阅读Comport。

AssignFile(OpenFile, '2nd_loader.hex');

Reset(OpenFile, 1);
repeat
  BlockRead(OpenFile, buf, sizeof(buf), fc1);
  Sleep(500);
  if fc1 <> 0 then begin
    Application.ProcessMessages;
  end;
until fc1 <> sizeof(buf);

CloseFile(OpenFile);

Comport1.Write(buf, sizeof(buf));

Sleep(100);
Application.ProcessMessages;

form1.ComPort1.ReadStr(r, 20);

最佳答案

您的代码没有将整个文件写入Comport(除非文件碰巧小于4096字节)。您正在读取文件,直到读取的大小不完全为4096字节的块(即文件中的最后一个块),然后仅发送该块(并发送垃圾,因为实际读取的字节数少于4096个)。您将忽略该块之前的所有内容。

您需要在循环中调用Comport.Write()Comport.ReadStr(),该循环在每次迭代中读取4096个字节,例如:

var
  buf: array[0..4095] of Byte;
  OpenFile: File;
  fc1, BytesRead: Integer;
begin
  AssignFile(OpenFile, '2nd_loader.hex');
  try
    Reset(OpenFile, 1);

    while not Eof(OpenFile) do
    begin
      fc1 := 0;
      repeat
        BlockRead(OpenFile, buf[fc1], sizeof(buf)-fc1, BytesRead);
        Inc(fc1, BytesRead);
      until (fc1 = sizeof(buf)) or Eof(OpenFile);

      if fc1 = 0 then Break;

      Comport1.Write(buf, fc1);
      ComPort1.ReadStr(r, 20);

      if GetQueueStatus(QS_ALLINPUT) <> 0 then
        Application.ProcessMessages;
    end;
  finally
    CloseFile(OpenFile);
  end;
end;

07-28 13:58