这个是读写串口程序的其中一部分函数,我看不大懂,希望高手指教!
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;
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;
ClearCommError(hCom, dwErrorFlags, @CommStat);
读串口数据
fSuccess:=ReadFile(hCom,
fReceived,
dwLength,
dwErrorFlags,
@fOs);
if (NeedReceivedDataNumber>0) then
begin
if (dwReceivedNumber > NeedReceivedDataNumber) then break; //已经读到的所需要字符时,则退出读取操作。
end; 这样的结构,不的建议,这样会死机,而且效率不高。