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
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
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; end;
procedure MyClass.startCom; var i : Integer; begin myComThread.Resume; for i := 1 to 20 do begin sleep(300); writeln('wait ' + inttostr(300*i) + ' ms...'); end; end;
end. |
//file: TComThread.pas
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;
type MyThread = class(TThread) public constructor Create; private ApdComPort: TApdComPort; procedure ApdComPortTriggerAvail(CP: TObject; Count: Word); procedure sende(text : String); protected procedure Execute; override; end;
implementation
constructor MyThread.Create; begin inherited Create(true); ApdComPort := TApdComPort.Create(nil); ApdComPort.ComNumber := 1; ApdComPort.OnTriggerAvail := ApdComPortTriggerAvail; end;
procedure MyThread.ApdComPortTriggerAvail(CP: TObject; Count: Word); var I : Word; C : Char; S : String; begin S := ''; for I := 1 to Count do Begin C := ApdComPort.GetChar; Case C of #0..#31 : ; else S := S + C; end; end; writeLn('received: ' + S); end;
procedure MyThread.sende(text : String); begin writeLn('send->Com1: ' + text); ApdComPort.Output := text + #13#10; end;
procedure MyThread.Execute; begin beep; sende('ATZ'); sleep(3000); writeln('execute ready'); 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
Tino: Code- durch Delphi-Tags ersetzt.