Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Comport - Status ? (https://www.delphipraxis.net/114953-comport-status.html)

Real-TTX 3. Jun 2008 12:08


Comport - Status ?
 
Hey Leute,

Ich möchte abfragen, ob ein Com Gerät vom PC getrennt wurde. Ich benutze AsyncPro für meine RS232 Funktionen. Dies ist auch ohne weiteres Möglich. Leider liefert AsyncPro keine Ereignisse mit die "OnDisconnect" oder ähnliches bedeuten. Es gibt ein Ereigniss "OnPortClose". Leider ist es nicht das was ich will...

Ich baue die Verbindung auf in dem ich eine property , nämlich "Open" auf True setze. Dann wird das Ereigniss aufgerufen "OnPortOpen". Wenn ich jetzt jedoch das Kabel Trenne oder das Gerät ausschalte. Passiert genau nichts. Die Eigenschaft bleibt auf True. Und Das Ereignisse OnPortClose wird nicht aufgerufen :(

Soweit ich weis könnte ich doch IoGetDeviceObject Pointer aus der Win32Api benutzen? Habe ich in der MSDN gefunden
http://msdn.microsoft.com/en-us/library/ms801459.aspx

Ich hoffe jemand hat ein Tipp oder Lösung ?

Danke für alles...

LG, Real-TTX

marabu 3. Jun 2008 12:17

Re: Comport - Status ?
 
Hallo,

schau dir mal das Event OnTriggerModemStatus() bzw. die Methode SetStatusTrigger() bei AsyncPro an. Vielleicht kannst du damit etwas erreichen.

Freundliche Grüße

Real-TTX 3. Jun 2008 12:43

Re: Comport - Status ?
 
Hmm.. Danke dir. Aber ich verstehe das nicht so ganz. Wenn ich ein Trigger hinzufüge und aktiviere. Kann ich ihn dann in OnTriggerStatus abfrage. Das ist klar. Aber das Problem ist: Ich weis nicht genauz welche Typen. Ich habe zwar die Doku. Offen.. Aber.. Naja.. Ich versteh das nicht so ganz, sorry :/



Ich habe es so atm :

Delphi-Quellcode:
ComPort.Open := True;
DeviceChange := ComPort.AddStatusTrigger(stModem);
ComPort.SetStatusTrigger(DeviceChange, msDCDDelta, True);

...


procedure TFrmMain.ComPortTriggerModemStatus(Sender: TObject);
begin
    REditConsole.Lines.Add('Geht ? ');
end;

procedure TFrmMain.ComPortTriggerStatus(CP: TObject; TriggerHandle: Word);
begin
  if (TriggerHandle = DeviceChange) then
    REditConsole.Lines.Add('Oder geht?');
end;

Wie gesagt, leider verstehe ich das nicht so genau wie das in Async Pro funktioniert :/

Gruß

Reinhard Kern 3. Jun 2008 12:59

Re: Comport - Status ?
 
Hallo,

Voraussetzung ist zuerst mal, dass sich beim Abziehen des Kabels überhaupt was ändert - wenn du nur die Datenleitungen benutzt hast, macht sich das Trennen nicht einmal hardwaremässig bemerkbar, geschweige denn in Software. Einen Event (im Win32 API) gibt es nur, wenn z.B. eine Handshakeleitung AKTIV (+12V) verbunden ist und deshalb beim Abziehen des Kabels auf inaktiv wechselt.

Gruss Reinhard

Chemiker 3. Jun 2008 20:32

Re: Comport - Status ?
 
Hallo,

ich mache die Übertragung leider nicht mit AsyncPro, aber in der Anwendung läuft ein Timer mit. Wenn eine bestimmte Zeit vergangen ist und bis dahin keine Daten entgegengenommen wurde wird ein Alarm ausgelöst. Wenn Daten empfangen wurden wird der Timer wieder neu gestartet.

Bis bald Chemiker

Real-TTX 4. Jun 2008 11:23

Re: Comport - Status ?
 
Gibt es keine Möglichkeit um zu Prüfen ob da was angeschlossen ist ? Widerstand vllt ? Oder kurze Daten senden ? (Art wie ein Keep Alive Signal). Ich verzweifel gerade. Habe sämtliche Sachen schon probiert die mir eingefallen sind. Auf LineBreak prüfen.. Geht alles nicht.... :

Gruß, Real-TTX

oldmax 4. Jun 2008 11:47

Re: Comport - Status ?
 
hi
Nun ja, RS 232 ist keine intelligentte Schnittstelle, jedenfalls nicht von Hause aus. Also muß du wohl selber Hand anlegen, entweder wie schon erwähnt die Handshake Leitungen vergewaltigen, also, z.B. mit Widerstand auf Potential legen und per Interrupt auswerten. (Wird bei Win >98 schwierig...) oder eben pollen. Ebenso denkbar ist ein "Lebenszeichen " mit TimeOut-Überwachung...., dazu muß aber das angeschlossene Gerät ständig etwas senden, entweder Daten oder eben Lebenszeichen. Einen "disconnect" kann die Schnittstelle eben nicht. Daher würd ich folgendermaßen vorgehen
Rufen : "bist du noch da" ( meine natürlich Zeichen senden) und eine Zeit anstoßen
auf Antwort warten
kommt Antwort " ja, bin hier" (natürlich auch hier eine entsprechende Bytekennung) dann Zeit zurücksetzen
ist Zeit abgelaufen, dann ist da niemand, der dir zuhört...
Nun mußt du dir nur eine entsprechende Kennung einfallen lassen, um Daten vom Lebenszeichen zu unterscheiden.
Eine fertige Lösung hab ich allerdings nicht, nur diesen Ansatz.
Gruß oldmax

Real-TTX 4. Jun 2008 16:00

Re: Comport - Status ?
 
Das Problem ist, dass es sich hierbei um Messschieber handelt. Und ich da leider keinen Einfluss darauf habe, oder doch?
Wenn ich Daten Hinschicke, bekomm ich nichts zurück :/

Gruß, Real-TTX

OldGrumpy 4. Jun 2008 16:14

Re: Comport - Status ?
 
Hast Du ne Doku zu dem Messschieber? Mit etwas Glück hat der im RS232-Stecker DTR/DSR gebrückt, dann kannst Du darauf checken (an DTR wackeln und gucken ob DSR mitwackelt). Müsste man mal untersuchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz