Einzelnen Beitrag anzeigen

hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

In einer Prozedur warten bis ein Ereignis eintrit

  Alt 15. Sep 2006, 13:31
'loha Folks,

folgendes Szenario:

Ich schicke über einen virtuellen Com Port (über USB -> CAN-Dongle) einen Befehl auf ein Gerät in einem CAN-Bus, um von diesem Daten anzufordern (z.B. ein Bild). Das Gerät nimmt nun das Bild auf, was ein wenig dauert (4-5 Sekunden) und schickt mir dann das Bild zurück (viele tausend Pakete).

Irgendwann tritt das Ereignis OnRxChar beim Com Port auf.

Nun möchte ich in ein und derselben Prozedur den angesprochenen Befehl absetzen und danach darauf warten bis dieses Ereigniss eintritt, um die Daten gleich wieder auszulesen und auf einem Webinterface anzuzeigen.

Da ich noch nicht so Delphi bewandert bin, weiss ich nicht, wie sich dieses "auf ein Ereignis warten" realisieren lässt und könnte etwas unterstützung gebrauchen.

Natürlich habe ich schon etwas zusammengeschustert, was mehr oder weniger funktioniert, aber leider nicht mit diesem Ereignis zusammenarbeitet.

Delphi-Quellcode:
procedure Tfrm_Manipulation.IWButton1Click(Sender: TObject);
var
  InputBuffer, Str, AnswStr: String;
  i, j, Count: Integer;
  Address, DLC, Data1: String;
  DataReceive: TDataReceive;
begin
  Count := 0;
  Address := '0D';
  DLC := '8';
  Data1 := '75';
  InputBuffer := '';

  if IWServerController.ComPort.Connected = False then
  begin
    SetCANSettings(Sender); // temporary, has to be replaced with a can setup window.
  end;
                              {1    1 1      111111122222222222
          1234567    89        0     1 2       34567890123456 789}

  Str := 'T000000' + Address + DLC + Data1 + '00000000000000'#$D;
  IWServerController.ComPort.WriteStr(Str); // write string to ComPort
  memCANMonitor.Lines.Add(Str);
  {
    Create object that holds the data specific for one user
  }


  {
    Read from ComPort
  }

  repeat
    Count := IWServerController.ComPort.InputCount;
  until
    Count > 0;
  while IWServerController.ComPort.InputCount <> 0 do
  begin
    IWServerController.ComPort.ReadStr(InputBuffer, Count);
    for j := 1 to Count do
    begin
      if InputBuffer[j] <> #13 then
      begin
        CAN232OutputBuffer := CAN232OutputBuffer + InputBuffer[j]
      end
      else
      begin
        while Pos('#7', CAN232OutputBuffer) > 0 do
        begin
          CAN232OutputBuffer[Pos('#7', CAN232OutputBuffer)] := '0';
        end;
        if (Length(CAN232OutputBuffer) > 1) and
          (CAN232OutputBuffer[1] <> 'A') then
        begin
// memCANMonitor.Lines.Add(#13);
          memCANMonitor.Lines.Add(CAN232OutputBuffer);
        end;
       CAN232OutputBuffer := '';
      end;
    end;
    Sleep(1500);
    Count := IWServerController.ComPort.InputCount;
  end;
  IWServerController.ComPort.Close;
end;
inde deus abest
  Mit Zitat antworten Zitat