Function sComm(sCommand As String, comReceive As MSComm) As String
Dim nReceiveCount As Integer
If comReceive.PortOpen = False Then
comReceive.PortOpen = True
End If
comReceive.Output = sCommand
Do
nReceiveCount = comReceive.InBufferCount
sleep (2) 'API 函数,挂起当前进程一段时间
Loop Until comReceive.InBufferCount = nReceiveCount
If comReceive.PortOpen = True Then
sComm = comReceive.Input
End If
End Function
注:此函数参照了xth一文。
此法一般是能确保数据接收的正确,但由于WINDOWS是多任务操作系统,当有耗时的进程运行时会丢失数据。如果系统会出现这种情况,可增大函数sleep()的参数值。
procedure TScanMsgCtrl.ParseCommPortData(PortData: PByte; DataSize: DWORD);
var
pData: PByte;
dwCount: DWORD;
aChar: Char;
begin
pData := PortData;
dwCount := DataSize;
while dwCount > 0 do
begin
aChar := Chr(pData^);
case aChar of
#$FE:
begin
FDataState := 0;
end;
#$FF
begin
//在这里对有效信息的处理
end
else
if FDataState = 0 then
FMsg[FMsgIndex] := aChar;
end;
Dec(dwCount);
Inc(pData);
end;
end;
procedure TScanMsgCtrl.ReceiverPortData(Sender:TObject; Count: Integer);
var
Buf: array[0..4096]of char;
begin
TComm.read(buf, count);
ParseCommPortData(buf, count);
end;
//TComm.OnRxChar = ReceiverPortData 这个事件里