AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Comport finden, an dem das gesuchte Gerät hängt
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von BAMatze · begonnen am 16. Feb 2009 · letzter Beitrag vom 16. Feb 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

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

  Alt 16. Feb 2009, 08:53
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
  Mit Zitat antworten Zitat
Franz Kogler

Registriert seit: 29. Mai 2007
9 Beiträge
 
Delphi 7 Personal
 
#2

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

  Alt 16. Feb 2009, 09:11
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
  Mit Zitat antworten Zitat
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#3

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

  Alt 16. Feb 2009, 09:20
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...:-/
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 16. Feb 2009, 09:35
@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.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 16. Feb 2009, 11:21
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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

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

  Alt 16. Feb 2009, 11:46
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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