Autor Beitrag
turngrobi
Hält's aus hier
Beiträge: 7

WIN 2000
D6 Prof, D7 Prof
BeitragVerfasst: So 26.10.03 22:10 
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 Anwendung sieht so aus:

//file: ComPort.dpr
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
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
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
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
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
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 :(

Die Ausgabe sieht so aus:
Zitat:
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

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
fgreber
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 01.04.05 13:07 
Hallo eine Frage meinerseits, wo hast du die Bibliotheken für "oomisc", "adport" her?

benötige diese Bibliotheken für meine Antort und ich finde diese nicht!
Hab Delphi versionb 6.0!
turngrobi Threadstarter
Hält's aus hier
Beiträge: 7

WIN 2000
D6 Prof, D7 Prof
BeitragVerfasst: Di 19.04.05 20:11 
Hi fgreber,
also eine Antwort brauche ich mittlerweile nicht mehr. Ich habe mein Problem schon gelöst. Es ist jedoch schon so lange her, dass ich nicht mehr sagen kann, wie ich es gemacht habe.

Die Bibliotheken kommen aus dem "TurboPower Async Professional - Projekt" und sind unter
sourceforge.net zu finden.