Delphi 如何将二进制文件写入4096个块中的comport,并在每4096个字节后读取comport应答

Delphi 如何将二进制文件写入4096个块中的comport,并在每4096个字节后读取comport应答,delphi,Delphi,我使用Delphi Comport411f组件,我需要将一个二进制文件读取到一个流中,然后我需要将该流以4096字节的块发送到Comport,并在写入每个块后从Comport读取 AssignFile(OpenFile, '2nd_loader.hex'); Reset(OpenFile, 1); repeat BlockRead(OpenFile, buf, sizeof(buf), fc1); Sleep(500); if fc1 <> 0 then begin

我使用Delphi Comport411f组件,我需要将一个二进制文件读取到一个流中,然后我需要将该流以4096字节的块发送到Comport,并在写入每个块后从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块后,我需要读一次文件

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);
AssignFile(OpenFile,'2nd_loader.hex');
重置(OpenFile,1);
重复
区块读取(OpenFile、buf、sizeof(buf)、fc1);
睡眠(500);
如果fc1为0,则开始
Application.ProcessMessages;
结束;
直至fc1 sizeof(buf);
CloseFile(OpenFile);
Comport1.Write(buf,sizeof(buf));
睡眠(100);
Application.ProcessMessages;
form1.ComPort1.ReadStr(r,20);

您的代码没有将整个文件写入Comport(除非文件恰好小于4096字节)。您一直在读取文件,直到读取了一个大小不完全为4096字节的块(即文件中的最后一个块),然后只发送该块(由于实际读取的字节数少于4096字节,因此发送垃圾)。你忽略了之前发生的一切

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

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;
var
buf:字节的数组[0..4095];
OpenFile:文件;
fc1,字节读取:整数;
开始
AssignFile(OpenFile,'2nd_loader.hex');
尝试
重置(OpenFile,1);
而不是Eof(OpenFile)呢
开始
fc1:=0;
重复
块读(OpenFile,buf[fc1],sizeof(buf)-fc1,BytesRead);
公司(fc1,字节读);
直到(fc1=sizeof(buf))或Eof(OpenFile);
如果fc1=0,则断开;
Comport1.Write(buf,fc1);
成分1.ReadStr(r,20);
如果GetQueueStatus(QS_ALLINPUT)为0,则
Application.ProcessMessages;
结束;
最后
CloseFile(OpenFile);
结束;
结束;

[DCC Error]Unit1.pas(4259):E2003未声明的标识符:“GetQueueState”@allismin是一个Win32 API函数,因此将
Windows
单元添加到
uses
子句中。您不应该首先在循环中调用
Application.ProcessMessages()
,但如果这样做,至少要在有东西等待处理时才调用它。@allismin正确的名称是
GetQueueStatus
而不是
GetQueueState
。我在回答中修正了这一点。