Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einzelnen Pin an der Seriellen Schnittstelle abfragen (https://www.delphipraxis.net/118328-einzelnen-pin-der-seriellen-schnittstelle-abfragen.html)

OldGrumpy 6. Aug 2008 13:48

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Au man, die Hitze bekommt mir wirklich nicht :) Ich schau mir jetzt gerade mal Code eines Objektes fürs Eventhandling einer seriellen Schnittstelle an. Mal schauen ob die was anders machen.

Also auf den zweiten Blick kommt mir das spanisch vor, was Du da mit der TmpMask anstellst. Das ist doch eine bitorientierte Flagsammlung, setzt Du da überhaupt den richtigen Wert? Setz mal bitte einen Breakpoint beim SetCommMask und sag mir welchen Zahlenwert TmpMask an der Stelle hat...

Alex_ITA01 6. Aug 2008 14:07

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Folgendes steht in tmpMask drinne:

EV_RXCHAR (= 1)

Ich habe es auch schon probiert, indem ich tmpMask auf EV_RING (=256 = $100) setze aber das ändert auch nix...

Danke erstmal für deine Bemühungen.
Hoffentlich kannst du mir noch ein wenig helfen.

Kann es evtl. sein, dass GetCommModemStatus nicht mehr bei WinXP unterstützt wird?
Weil ich bekomme immer eine 0 zurückgeliefert in nStatus.

Gruß
Alex

OldGrumpy 6. Aug 2008 14:36

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Hmm... Kannste mal etwas mehr Code liefern? Vielleicht suchen wir gerade an der falschen Stelle... Wäre z.B. super hilfreich wenn Du die Codeblöcke fürs Init und Eventhandling etwas besser trennen könntest. Für mich sieht der Code irgendwie aus als wenn Du direkt nach dem Öffnen des Ports einen Event behandeln willst... :gruebel: Wo kommen z.B. die Sachen wie RXEvent her?

Alex_ITA01 6. Aug 2008 14:40

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Also das ist in alles in einer Komponente von unserer Firma. Daher nur der Ausschnitt oben...
Das Event ist nur eine Eigenschaft der Kompo aber die steht standardmäßig auf EV_RXCHAR.

Ich habe dann nur noch ein Thread außenrum, der zyklisch prüft, ob sich auf der Schnittstelle was tut...

Delphi-Quellcode:
if GetCommModemStatus(SerHandle, nStatus) then
begin
  if ((nStatus and MS_CTS_ON) > 0) or
     ((nStatus and MS_DSR_ON) > 0) or
     ((nStatus and MS_RING_ON) > 0) or
     ((nStatus and MS_RLSD_ON) > 0) then
    Result := True;
end;
Selbst wenn ich Zyklisch im Thread das oben aufrufe, ist Result immer False...
Mehr benutze ich nicht.

Viele Grüße
Alex

OldGrumpy 6. Aug 2008 15:01

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
das Eventding wirst Du umbauen müssen, denn Du willst ja auf mehrere Events reagieren und nicht nur auf eines, oder? Momentan kannst Du ja entweder auf RI oder auf ankommende Zeichen triggern, und wenn ich Dich richtig verstanden habe, willst Du ja beides. Da müsste der Flagwert also $101 sein. Desweiteren solltest Du bei den ganzen API-Aufrufen IMMER den Rückgabewert checken. Wenn der (bei BOOL APIs) nicht TRUE ist, dann mit GetLastError mehr Infos holen. So lässt sich der Fehler einkreisen. Zu allerletzt noch eine Idee... Es gibt Hardware die den RI gar nicht angeschlossen hat. Ist zwar ne schlechte Idee, aber schon zu meinen Mailboxzeiten gab es z.B. auch Modems die nur ein RING schickten statt den Pin zu ziehen. Teilweise wars auch nach Gusto konfigurierbar.

Jedenfalls lässt Deine Konstruktion da offen ob schon der Aufruf von GetCommModemStatus fehlschlug oder nur die Bits alle null waren.

Alex_ITA01 6. Aug 2008 15:09

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Erstmal Danke für die Infos.
Habe folgendes probiert:

Anstatt

Delphi-Quellcode:
if SetCommMask(SerHandle, TmpMask) then
habe ich jetzt

Delphi-Quellcode:
if SetCommMask(SerHandle, TmpMask or EV_RING) then
probiert. Das müsste ja dann für beide Events sein so wie ich dich verstanden habe.
Dadurch ändert sich mein Problem trotzdem nicht.

Desweiteren ist der Rückgabewert der Funktion GetCommModemStatus True daher ist mit GetLastError nix zu holen.

Außerdem habe ich eine Software gefunden (ComSniffer), welche mir anzeigt ob der RI kommt oder nicht und wenn ich dieses Bit bei meinem "Gegenüber" aktiviere, dann sehe ich dies in dem ComSniffer auch (das heißt, dass Signal liegt also auch Hardwaremäßig an).

Habe echt langsam keine Ideen mehr...
Viele Grüße
Alex

OldGrumpy 6. Aug 2008 22:33

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Lies mal das hier aus der Microsoft KB... Interessant. Probiers mal aus!

Nachtrag: Das scheint wohl noch aus Win95-Zeiten zu sein. Ich werd hier mal Hardware aufbauen um es zu testen, das mach ich aber heute nicht mehr. Bin etwas angeschlagen und deshalb gehts heute mal früher ins Bett :)

Alex_ITA01 7. Aug 2008 06:59

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Guten Morgen und danke erstmal für deine Bemühungen.
EV_RINGTE kann ich leider nicht verwenden, ist nicht mehr vorhanden als Const in der Windows Unit...
Ich hatte es ja gestern mit einem ComPort Sniffer getestet und der hatte mir den RI komischerweise nur ganz kurz angezeigt obwohl ich die Spannung die ganze Zeit an Pin9 messen kann. Evtl. liegt das aber auch an dem Sniffer. Ich weiß ja nicht wie der arbeitet.
Hoffentlich hast du Erfolg mit deinem Aufbau.

Viele Grüße
Alex

Alex_ITA01 8. Aug 2008 12:22

Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
 
Hallo OldGrumpy,
hast du etwas mit deinem Versuchsaufbau erreicht?
Ich habe gestern noch ein bisschen experimentiert und festgestellt, dass wenn ich ein ComPort nehme, den es Hardwaremäßig gar nicht gibt (z.B. ich nehme COM2 obwohl ich nur COM1 habe), dann gibt mir die Funktion GetCommModemStatus mit nachstehenden Vergleich (RI) True zurück...
Komisch...

Viele Grüße
Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Seite 2 von 2     12   

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