Console + eventhandling (Konsolenanwendung)

Hi,

ich habe folgendes Problem:

ich möchte in meiner Konsolenanwendung eine Ereignissbehandlung programmieren. Diese kleine Anwendung soll mit Hilfe einer Bibliothek von Turbopower über die serielle RS232- (Com1-) Schnittstelle kommunizieren. Wenn ich die Anwendung fensterbasiert in einem Frame programmiere, funktioniert sie ohne weiteres. Eine Nachricht wird einfach über die Com1-Schnittstelle verschickt und sobald eine Antwort empfangen wird, wird das Ereignis ‚OnTriggerAvail‘ ausgelöst. Mit einer entsprechenden Prozedur kann ich dann die empfangene Nachricht auslesen und ausgeben.

Mein Problem in der Konsolenanwendung entsteht beim Empfangen der Antwort. Ich weiß nicht wie ich meiner Anwendung beibringen soll, das ‚OnTriggerAvail‘-Event auszulösen, wenn die Antwort ankommt.

Der Code meiner Anwengung sieht so aus:

//file: ComPort.dpr

program ComPort;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 TMyClass in 'TMyClass.pas',
 TComThread in 'TComThread.pas';

var myClassObj : MyClass;

begin
 myClassObj := MyClass.Create;
 myClassObj.startCom;
 myClassObj.Free;
end.

//-----------------------------------------//

//file: TMyClass.pas

unit TMyClass;

interface

uses SysUtils,
 TComThread;

type
 MyClass = class
 public
 constructor Create;
 procedure startCom;
 private
 myComThread : MyThread;
 end;

implementation

constructor MyClass.Create;
begin
 myComThread := MyThread.Create; _{Thread-Objekt erzeugen}_
end;

procedure MyClass.startCom;
var i : Integer;
begin
 myComThread.Resume; _{Thread starten}_ 
 for i := 1 to 20 do begin
 sleep(300);
 writeln('wait ' + inttostr(300\*i) + ' ms...');
 end;
end;

end.

//-----------------------------------------//

//file: TComThread.pas

unit TComThread;

interface

uses
 Classes, SysUtils,
 OoMisc, AdPort, SyncObjs; _{Klassen für die TurboPower-Komponente}_

type
 MyThread = class(TThread)
 public
 constructor Create;
 private
_{Klasse von Turbopower zur Kommunikation über die Com-Schnittstelle}_
 ApdComPort: TApdComPort; 
_{Ereignis-Prozedur für das Empfangen von Nachrichten}_
 procedure ApdComPortTriggerAvail(CP: TObject; Count: Word);
_{Prozedur zum Senden von Nachrichten}_
 procedure sende(text : String);
 protected
_{Execute wird aufgerufen, wenn der Thread gestartet wird}_
 procedure Execute; override;
 end;

implementation

constructor MyThread.Create;
begin
 inherited Create(true);
 ApdComPort := TApdComPort.Create(nil); _{Kommunikations-Objekt erzeugen}_
 ApdComPort.ComNumber := 1; _{Com-Port festlegen}_
 ApdComPort.OnTriggerAvail := ApdComPortTriggerAvail; _{Ereignis mit der Prozedur verknüpfen}_
end;

procedure MyThread.ApdComPortTriggerAvail(CP: TObject; Count: Word);
var
 I : Word;
 C : Char;
 S : String;
begin
 S := ''; _{Initialisieren}_
 for I := 1 to Count do Begin 
 C := ApdComPort.GetChar; _{Zeichen aus dem Empfangspuffer holen}_
 Case C of
 #0..#31 : ; _{Sonderzeichen nicht behandeln}_
 else S := S + C; _{Empfangene Nachricht zusammensetzen}_
 end;
 end;
 writeLn('received: ' + S); _{Empfangene Nachricht auf Konsole ausgeben}_
end;

procedure MyThread.sende(text : String);
begin
 writeLn('send-\>Com1: ' + text); _{zu sendende Nachricht auf Konsole ausgeben}_
 ApdComPort.Output := text + #13#10; _{Nachricht senden}_
end;

procedure MyThread.Execute;
begin
 beep; _{Signalton ausgeben}_ 
 sende('ATZ'); _{Nachricht 'ATZ' senden}_
 sleep(3000); _{3 sec warten}_
 writeln('execute ready'); _{statusmeldung: Thread ist beendet}_
end;

end.

//------------------------------------------//

Wenn zu einem analogen Modem ein Text wie z.B. ‚ATZ‘ geschickt wird, so sendet dieses als Antwort die gleiche Nachricht zurück. Also müsste ich eigentlich auch wieder ‚ATZ‘ empfangen. Leider empfange ich gar nichts :frowning:

Die Ausgabe sieht so aus:
send->Com1: ATZ
wait 300 ms…
wait 600 ms…
wait 900 ms…
wait 1200 ms…
wait 1500 ms…
wait 1800 ms…
wait 2100 ms…
wait 2400 ms…
wait 2700 ms…
wait 3000 ms…
execute ready
wait 3300 ms…
wait 3600 ms…
:

Ich verstehe nicht, wieso das nicht funktioniert. Was mache ich falsch? oder wo fehlt noch was?

Vielen Dank