![]() |
Einzelnen Pin an der Seriellen Schnittstelle abfragen
Hallo zusammen,
ich habe eine serielle Schnittstelle und kann auch mit dem "Gegenüber" über das serielle Protokoll kommunizieren. Leider gibt es noch ein Signal bei meinem "Gegenüber" welches entweder als High oder Low an Pin 9 anliegt und mir dieses "Bit" nicht über das Kommunikationsprotokoll mitschickt. Kann ich irgendwie abfragen, ob Pin9 = High ist? Viele Grüße Alex |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Ich gehe mal davon aus, dass Du da eine herkömmliche RS232 auf nem SubD-9 liegen hast. Dann ist Pin 9 der RI (Ring Indicator), damit würde ein angeschlossenes Modem einen eingehenden Anruf signalisieren. Schau halt in der Doku deiner jeweiligen Komponente nach Events dafür.
|
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Ja, das ist richtig wie du es sagst. Es geht um den RI.
Ich benutze dafür keine fertige Komponente sondern übertrage die Daten selber in meiner Software... Gruß Alex |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Ich kann leider nicht mit so passendem Wissen wie OldGrumpy trumpfen, aber von der ToolBox die Komponente TSerial könnte pinweise abfragen. Evtl. kannst du dort im Quelltext ein wenig Inspiration finden.
Edit: hier ist ein Weblink mit mehr Info: ![]() |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Zitat:
|
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Hab jetzt die Funktion "GetCommModemStatus" gefunden.
Werde es erstmal damit testen... Danke erstmal Viele Grüße Alex |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Hallo,
ich habe es jetzt wie folgt probiert:
Delphi-Quellcode:
Ich habe außerdem am seriellen Kabel gemessen und bei Pin9 kann ich das Signal auch wirklich messen.
if GetCommModemStatus(SerHandle, nStatus) then
begin Result := (nStatus and MS_RING_ON) > 0; end; Leider gibt mir die oben genannte Funktion immer False zurück, obwohl das Signal ansteht (wenn das Signal nicht ansteht, dann gibts sie auch False zurück). Habt ihr noch eine Idee? Gruß Alex |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Hier zur Info (so initialisiere ich meine serielle Schnittstelle):
Delphi-Quellcode:
Ich habe auch schon probiert die EventMaske zu ändern aber dieser RI (mit der Funktion GetCommModemStatus) kommt bei mir einfach nicht an.
SerHandle := CreateFile (NullStr, Generic_Read or Generic_Write, 0, Nil,
Open_Existing, FILE_FLAG_OVERLAPPED, 0); if SerHandle <> INVALID_HANDLE_VALUE then begin if SetupComm (SerHandle, InBuffer, OutBuffer) then begin FillChar (DCB, SizeOf(DCB), 0); DCB.DCBlength := SizeOf (DCB); DCB.BaudRate := Baud; DCB.Flags := $0001; DCB.Parity := Ord (Parity); DCB.ByteSize := ByteSize; DCB.StopBits := Ord (StopBits); DCB.EvtChar := RXFlagChar; if SetCommState (SerHandle, DCB) then begin With CommTimeOuts do begin { TimeOut's setzen } ReadIntervalTimeout := RXZVZ; ReadTotalTimeoutMultiplier := 0; ReadTotalTimeoutConstant := RXTimeOut; WriteTotalTimeoutMultiplier := 0; WriteTotalTimeoutConstant := TXTimeOut; end; if SetCommTimeouts(SerHandle, CommTimeOuts) then begin if RTSCTS = Ja then { Hardwarehandshake } begin EscapeCommFunction(SerHandle, SETRTS); EscapeCommFunction(SerHandle, SETDTR); end; Case RXEvent of { Eventmaske setzen } RXChar : TmpMask := EV_RXCHAR; { Jedes Zeichen } RXFlag : TmpMask := EV_RXFLAG; { Bei Empfang Zeichen RXFlagChar } RXRing : TmpMask := EV_RING; RXCTS : TmpMask := EV_CTS; RXDSR : TmpMask := EV_DSR; else TmpMask := 0; end; if SetCommMask(SerHandle, TmpMask) then begin StrPCopy (NullStr, 'Read_'+DeviceIdent); rOverlapped.hEvent := CreateEvent (NIL, { Security attr. } True, { Manuel reset ?? } False, { Signaled ?? } NullStr); { Signif.name } StrPCopy (NullStr, 'Write_'+DeviceIdent); wOverlapped.hEvent := CreateEvent (NIL, { Security attr. } True, { Manuel reset ?? } False, { Signaled ?? } NullStr); { Signif.name } if (rOverlapped.hEvent <> Null) and (wOverlapped.hEvent <> Null) then begin Success := True; end; end; end; end; end; end; Wäre nett, wenn jemand noch eine Idee hat. Danke und Gruß Alex |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Warum benutzt Du nicht SetCommMask und GetCommMask statt Get/SetCommModemMask? Immerhin hast Du da ja kein Modem sondern nur einen Comport, oder?
|
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
hä? Ich benutze doch SetCommMask (siehe Source oben drüber)...
Viele Grüße Alex |
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... |
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 |
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?
|
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:
Selbst wenn ich Zyklisch im Thread das oben aufrufe, ist Result immer False...
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; Mehr benutze ich nicht. Viele Grüße Alex |
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. |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Erstmal Danke für die Infos.
Habe folgendes probiert: Anstatt
Delphi-Quellcode:
habe ich jetzt
if SetCommMask(SerHandle, TmpMask) then
Delphi-Quellcode:
probiert. Das müsste ja dann für beide Events sein so wie ich dich verstanden habe.
if SetCommMask(SerHandle, TmpMask or EV_RING) then
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 |
Re: Einzelnen Pin an der Seriellen Schnittstelle abfragen
Lies mal
![]() 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 :) |
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 |
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 21:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz