Hallo erstmal danke für eure schnelle Reaktion...
Es Handelt sich hier um das ständige abfragen von Messwerten einer Elektronik...
Delphi-Quellcode:
//++++++++++++++++++++++++++++++++++
//Sender der Message an über Comport
//++++++++++++++++++++++++++++++++++
function TForm1.SendMessagetoCOM(const FTCMessage: String; const interval: word ; var ErrorMsg: String; bSetRich: Boolean): boolean;
var
iDelay : word;
i : integer;
MyChar : Char;
wfmo,
LoopMax : word;
begin
result:= false;
if ComPort.Connected then
begin
//MPCComData ist eine globaler Variable (Record)
MPCComData.text := '';
iDelay := COM_DELAY; //Const
wfmo := 0;
LoopMax := COM_LOOP_RECIEVED;
MPCComData.bRecieved:= True;
// Sender der Chars (mit einer Delay) wegen hoher Bautrate 921600
for I := 1 to length(FTCMessage) do
begin
MyChar:= FTCMessage[i];
ComPort.WriteStr(MyChar);
delay( iDelay);
end;
i := 0;
ErrorMsg := '';
// Schleife wird durchlaufen und bei Event oder nach Durchlauf von Loop beendet...
// Rückantwort verarbeiten...
repeat
wfmo := WaitForMultipleObjects(length(EventRecieveds), @EventRecieveds, False, interval );
Application.ProcessMessages; //Nur bei Hautthread benötigt...
inc(i);
if Application.Terminated then i:=LoopMax; // oder Thread.terminated
until (wfmo <> WAIT_TIMEOUT) or ( i = LoopMax);
MPCComData.bRecieved:= false;
if wfmo=0 then
begin
if bSetRich then
RiCOMText.Lines.Add(MPCComData.text);
result:= true;
end;
case wfmo of
WAIT_OBJECT_0 + 0: ErrorMsg := rsEventRecieved;
WAIT_OBJECT_0 + 1: ErrorMsg := rsEventCustomer;
WAIT_OBJECT_0 + 2: ErrorMsg := Format(rsEventSignaled, [WAIT_OBJECT_0 + 3]);
WAIT_TIMEOUT: ErrorMsg:= rsTimeOut;
else
ErrorMsg:= 'Error';
end;
if i= LoopMax then
ErrorMsg:= 'Loop to end';
end;
end;
//++++++++++++++++++++++++++++++++++
// Empfangen der Daten
//++++++++++++++++++++++++++++++++++
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
i : integer;
rxBuffer: String ;
begin
ComPort.ReadStr(Str, Count);
if MPCComData.bRecieved then
begin
for i := 1 to length(str) do
begin
if (str[i] = #10) or (str[i] = #13) then
begin
MPCComData.text := rxbuffer;
MPCComData.bRecieved := false;
SetEvent(EventRecieveds[0]);
break;
end
else
rxbuffer:=rxbuffer+str[i];
end;
end;
end;
Wegen der hohen Bautrate ist kein Software-Handshake möglich... also muß ich immer auf eine Antwort warten, damit ich auch eine Steuerung über meine Software ermöglich kann...
Gruß
Delpifant