Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Comport finden, an dem das gesuchte Gerät hängt (https://www.delphipraxis.net/129274-comport-finden-dem-das-gesuchte-geraet-haengt.html)

BAMatze 16. Feb 2009 07:53


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

Franz Kogler 16. Feb 2009 08:11

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

Sven M. 16. Feb 2009 08:20

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...:-/

BAMatze 16. Feb 2009 08:35

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.

messie 16. Feb 2009 10:21

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

Reinhard Kern 16. Feb 2009 10:46

Re: Comport finden, an dem das gesuchte Gerät hängt
 
Zitat:

Zitat von messie
Ich mache das, indem ich von COM1 bis COM20 versuche, alle Ports zu öffnen (try->Comport1.Open->except). ...

Hallo,

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 01:17 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