Einzelnen Beitrag anzeigen

delphifant

Registriert seit: 20. Dez 2007
Ort: nähe Freiburg
14 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Comport-Exception abfangen und verbindung schließen

  Alt 5. Feb 2009, 11:30
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
Gruß

Delphifant
  Mit Zitat antworten Zitat