'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;