Announcement

Collapse
No announcement yet.

Konsolenanwendung (console) + event

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Konsolenanwendung (console) + event

    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

    <pre>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.</pre>

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

    //file: TMyClass.pas

    <pre>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.</pre>

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

    //file: TComThread.pas

    <pre>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.</pre>

    Was mache ich falsch? oder wo fehlt noch was?
Working...
X