这个是读写串口程序的其中一部分函数,我看不大懂,希望高手指教!
function TSerialPort.ReceivedCOMQD5_JData(NeedReceivedDataLength: integer;NeedReceivedDataNumber:DWORD): Integer;
var
  i, Lower, ReceivedLength,BASE: Integer;
  dwErrorFlags, dwLength: DWORD;
  CommStat: TComStat;
  fSuccess, fReady: boolean;
  tmpChar: array of char;
  dwReceivedNumber:DWORD;
begin
  ReceivedLength:=0;
  fReady:=False;
  dwReceivedNumber :=0;
  while True do
    begin
      inc(dwReceivedNumber);
      ClearCommError(hCom, dwErrorFlags, @CommStat);
      dwLength:=CommStat.cbInQue;
      if (NeedReceivedDataNumber>0) then
      begin
        if (dwReceivedNumber >  NeedReceivedDataNumber) then  break;
      end;      if (dwLength<=0) and (not fReady) then
        continue;      if (dwLength<=0) and (fReady) then
        break;      FillChar(fReceived, 4096, #0);
      fSuccess:=ReadFile(hCom,
                         fReceived,
                         dwLength,
                         dwErrorFlags,
                         @fOs);
      if not fSuccess then
        continue;      ReceivedLength:=ReceivedLength + dwLength;
      Lower:=Length(tmpChar);
      SetLength(tmpChar, Lower + dwLength);
      for i := 0 to dwLength - 1 do
        tmpChar[i+Lower]:=fReceived[i];
      if (i+Lower>=NeedReceivedDataLength) then fReady:=True;
    end;
  //SetLength(ReceivedDatas, Length(tmpChar));
  for i := 0 to min(4094,High(tmpChar)) do  ReceivedDatas[i]:=tmpChar[i];
  if (ReceivedLength<NeedReceivedDataLength) and (ReceivedLength>0) then
     while true do
       begin
          ClearCommError(hCom, dwErrorFlags, @CommStat);
          dwLength:=CommStat.cbInQue;
          if dwLength<=0 then  continue;
          FillChar(fReceived, 4096, #0);
          fSuccess:=ReadFile(hCom,
                             fReceived,
                             dwLength,
                             dwErrorFlags,
                             @fOs);
          if not fSuccess then continue;
          BASE:=ReceivedLength;
          ReceivedLength:=ReceivedLength+dwLength;
          for i := 0 to dwLength-1 do ReceivedDatas[BASE+i]:=fReceived[i];
          if ReceivedLength>=NeedReceivedDataLength  then break;
      end;
  Result:=ReceivedLength;
end;

解决方案 »

  1.   

    清串口缓冲数据
    ClearCommError(hCom, dwErrorFlags, @CommStat); 
    读串口数据
          fSuccess:=ReadFile(hCom, 
                            fReceived, 
                            dwLength, 
                            dwErrorFlags, 
                            @fOs); 
      

  2.   

      dwLength:=CommStat.cbInQue;//这是缓冲区已有的字符。
          if (NeedReceivedDataNumber>0) then  
          begin
            if (dwReceivedNumber >  NeedReceivedDataNumber) then  break;  //已经读到的所需要字符时,则退出读取操作。
          end; 这样的结构,不的建议,这样会死机,而且效率不高。