这个是读写串口程序的其中一部分函数,我看不大懂,希望高手指教!
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;
解决方案 »
- 求教关于DELPHI中private,protected,public,published作用域的问题
- Delphi 2006 QuickReport 转成PDF。在线急等!!!
- 求最快的截屏函数!最好是 50ms 之内!
- 我在D7里面写一个程序,要用到ftp,大家推荐一个好一点的ftp控件吧?
- DELPHI打包
- 如何判断鼠标点击了哪一个对像
- DELPHI中如何实现象 QQ这样的广域网通信!
- 有办法实现本地局域网里面的数据库和网站上的数据库一起更新吗?
- 如何让操作系统正确显示繁体字?
- 请问如何在用TMediaPlayer控件播放VCD中的.DAT文件时,控制使用那个声音通道?
- 北京Delphi程序员求职
- 请教灰鸽子源代码问题
ClearCommError(hCom, dwErrorFlags, @CommStat);
读串口数据
fSuccess:=ReadFile(hCom,
fReceived,
dwLength,
dwErrorFlags,
@fOs);
if (NeedReceivedDataNumber>0) then
begin
if (dwReceivedNumber > NeedReceivedDataNumber) then break; //已经读到的所需要字符时,则退出读取操作。
end; 这样的结构,不的建议,这样会死机,而且效率不高。