![]() |
Comport finden, an dem das gesuchte Gerät hängt
Hallo DPler,
Ich habe mehrere Perepherie-Geräte für ein Steuerprogramm angeschlossen. Bisher steuere ich diese indem ich statisch im Programm die Comports zuweise. Jetzt kurz vor Fertigstellung möchte ich dies ändern. Ziel wäre es, da ich nicht weiß, wie die Geräte vom Endverbraucher an den Rechner geschlossen werden und welche ComPorts ihnen der Rechner des Endverbrauchers zuweißt, dass mein Programm herausfindet, an welchen Com-Schnittstellen, welches Gerät (es handelt sich dabei um mehrere verschiedene Geräte) angeschlossen ist. Gibt es eine Möglichkeit über die Komponente TComport eventuell belegte ComPorts und Geräte ID (oder ähnliches auszulesen) oder vieleicht mit der Registry? Würde mich über Anregungen zum Lösen dieses Problems sehr freuen. Vielen Dank BAMatze |
Re: Comport finden, an dem das gesuchte Gerät hängt
Hallo BAMatze,
wie es mit der Komponente TComport geht, weiß ich nicht. Ich benutze folgende Funktion: function ComAvailable(ComNr: byte): longbool; var TestHandle : integer; begin TestHandle :=CreateFile(PChar('\\.\COM'+IntToStr(ComNr)),GENE RIC_READ or GENERIC_WRITE,0, nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0)) ; if (TestHandle <= 0) then Result := false else begin Result := true; CloseHandle(TestHandle); end; end; Damit kann man ermitteln, ob der Comport existiert. Franz |
Re: Comport finden, an dem das gesuchte Gerät hängt
Hi Matze,
nachdem du überprüft hast, ob ein Com-Port überhaupt existiert, sehe ich da folgende Möglichkeiten: 1. Wenn die Geräte selbststänig kontinuierlich Daten senden, kannst du diese auf bestimmte Merkmale der entsprechenden Geräte abfragen und damit herausfinden um welches Gerät es sich handelt. 2. Du sendest einen Befehl an das Gerät, woraufin du bestimmte Daten erwartest. Diese gleichst du dann miteinander ab und stellst fest, ob diese dem entsprechenden Muster entsprechen. Ich sehe hier allerdings das Problem, dass du nicht weißt, wie eventuell angeschlossene Fremdgeräte auf den entsprechenden Befehl reagieren. Daher würde ich davon lieber Abstand nehmen. Ist auf jeden Fall nicht so einfach, dieses Problem userfreundlich und sicher zu lösen...:-/ |
Re: Comport finden, an dem das gesuchte Gerät hängt
@Franz,
Dank dir schonmal für diese doch recht einfache Lösung um erstmal entweder belegte oder freie (je nachdem, ob man true oder false abfragt) ComPorts zu bekommen. @Sven, genauso sehe ich das auch. Am Freitag hatte ich das versucht mit den mitgelieferten Funktionen aus der DLL, da ich gehofft hatte, dass die Comport-Öffnungsfunktion schon verifiziert, ob es sich um das gewünschte Gerät handelt. Dies ist leider nicht der Fall. Ich denke ich werde jetzt für die ermittelten belegten ComPorts einfach die Versions-Ermittlung-Funktion benutzen, die glaube ich alle angeschlossenen Komponenten mitgeliefert haben. Nur das richtige Gerät, so hoffe ich, antwortet auf den entsprechenden Befehl und liefert mir einen sinnvollen Ausdruck zurück. |
Re: Comport finden, an dem das gesuchte Gerät hängt
Ich mache das, indem ich von COM1 bis COM20 versuche, alle Ports zu öffnen (try->Comport1.Open->except). Schlägt das fehl weil der Port nicht da ist, bekomme ich eine EComPort-Exception, die ich abfange. Ist der Port vorhanden, versuche ich etwas Festgelegtes zu pollen oder eine sinnvolle Datenstruktur zu erkennen, falls das Gerät selbst die Werte feuert. Kommt da nix bei raus, wird der Port geschlossen und es geht mit dem nächsten weiter.
Hat sich eigentlich bewährt. Grüße, Messie |
Re: Comport finden, an dem das gesuchte Gerät hängt
Zitat:
damit verhinderst du wenigstens, eine laufende Verbindung zu einem Fremdgerät zu stören, weil du da nicht reinkommst. Es besteht aber weiterhin die Gefahr, ein Gerät anzusprechen, das angeschlossen ist aber gerade keine Verbindung aufgebaut hat. Wenig wahrscheilich, aber nimm mal an du sendest "38" und der Raumthermostat nimmt das als neue Solltemperatur... Wegen solcher Nebenwirkungen gibt es schon immer die Möglichkeit, Windows anzuweisen, auf bestimmten Com-Ports NICHT nach einer Maus zu suchen. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 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