![]() |
Dynamisch ComPort ermitteln...
Hallo Delphi-Kollegen!!
Ich verwende AsyncPro um Daten von den USB-Schnittstellen zu lesen...alles ok!! Da auf jedem PC die ComPort-Nummern anders sein können/werden, suche ich nach einer Möglichkeit, daß die Applikation selbstständig alle Ports scannt und den richtigen Port findet?? Bislang stellte ich dem Anwender eine Combo-Box zur Auswahl seines Anschlusses zur Verfügung...geht das auch auf eine automatische Art und Weise, sodaß sich darum der Anwender nicht kümmern muß?? LG Thomas |
Re: Dynamisch ComPort ermitteln...
dann müsstest du wissen woran du erkennst ob du den richtigen Comport hast. Und das hängt ja dann vom Gerät ab. Und was ist wenn er Nutzer mehrere Geräte angeschlossen hat? Dann könnte er nicht auswählen welches er nutzen will.
|
Re: Dynamisch ComPort ermitteln...
Hintergrund meiner Frage ist folgender:
Eine USB-GPS-Maus sowie ein Bewegungssensor (ebenfalls über USB) hängen über einen Hub an meinem Laptop. Hier ist es ja klar, an welchen Port welcher Sensor sitzt. Nur wenn ich meinen Hub an einen anderen Laptop hänge, dann vergibt Windows unter umständen andere Port-Nummern. Nun müßte der Anwender, der in der Regel ein Laie ist, herausfinden welcher Sensor, welche Port-Nummer hat. Und diese Arbeit will ich ihm abnehmen... Den richtigen Comport würde ich wahrscheinlich, an der Art der erhaltenen Werte erkennen können.....beim Bewegungssensor sind es Realwerte, beim GPS sind es NMEA-String-Sätze....find i zwar auch ned einen guten Ansatz, aber zumindest müßte sich das auf diese Weise unterscheiden lassen??!! Oder bietet für genau mein Anliegen bereits AsyncPro alle Features und ich weiß sie nur nicht?? :wall: |
Re: Dynamisch ComPort ermitteln...
Hatte noch keiner dieses Problem??
|
Re: Dynamisch ComPort ermitteln...
Hallo Bingo72,
du kannst das Thema imho nur damit lösen, in dem du in einer sogenannten Initialisierungsprozedur folgendes tust: - alle vorhandenen Com-Ports finden, - beim ersten beginnend jeden Port öffnen, - auf initialisierung deiner Endgeräte eine definierte Zeit warten, - erhaltenen Traffic auswerten welches deiner Geräte passt oder Timeout abwaren, - erkannte eigenen Geräte auflisten, - Kunden Auswahl bestätigen lassen. Das setzt voraus, dass deine Geräte nach öffnen des Ports automatisch Daten schicken. Deine GPS-Maus sollte dies tun (ich glaube NMEA-Protokolle). Läßt sich ein Port nicht öffnen, ist er von einer anderen Anwendung belegt. Diese Exception mußt du abfangen und entsprechend verarbeiten. Werden mehrere Geräte des richtigen Typs erkannt bietest du dem anwender eine Auswahl an. Sollten deine Geräte auf eine spezielle Sequenz antworten, so kannst du diese natürlich auch auf jeden Port senden. Damit entsteht aber das Problem, dass Geräte die diesen nicht verarbeiten können Sachen tun die nicht erwünscht oder gut sind. Aus diesem Grund würde ich die passende Methode vorziehen. Wie man zu den eingerichteten Com-Ports die dazugehörigen installierten Treiber erkennt weis ich leider nicht. Sollte das möglich sein und diese speziell für deine Endreräte eingerichtet sein, so besteht auch die Möglichkeit diese zu erkennen und eine entsprechende Zuordnung zu setzen. Imho benötigt eine GPS-Maus aber keinen speziellen Treiber. Somit müßte sich diese Variante ausschließen. Gruß oki |
Re: Dynamisch ComPort ermitteln...
... normalerweise macht man soetwas nicht, das ist zu unsicher. Wir beschäftigen uns seit 20 Jahren mit dem Thema und verpassen unseren Applikationen einen Konfigurations-Dialog, in dem der Anwender einträgt, an welchem Com-Port welches Gerät hängt. Nebenbei wird hier noch Baudrate, Start-Stop Bits, Parität und Flusskontrolle eingestellt.
In deinem speziellen Fall kannst Du versuchen, über eine Heuristik genau deine beiden Geräte zu finden. Das dürfte sogar funktionieren, zumal du genau weisst, was rüberkommen muss. Diese Vorgehensweise wurde ja eben schon von oki erläutert. Aber Eins verstehe ich nicht: USB und COM-Ports, wie passt das zusammen? |
Re: Dynamisch ComPort ermitteln...
Hallo Oki!!
Danke für Deine rasche Antwort....so in die Richtung hab ich mir das auch gedacht... Ich hab mal sowas in die Richtung ausprobiert:
Delphi-Quellcode:
Kurz zur Erklärung:
procedure TComPorts.ComPortTest;
var lStatusOK : Boolean; lPortNr : Byte; lMaxPortNr : Byte; begin lStatusOK := true; lPortNr := 0; lMaxPortNr := 128; repeat try CloseAccel; inc(lPortNr); AccelComPort.ComNumber := lPortNr; InitAccel; StartAccel; except end; until (lPortNr = lMaxPortNr); end; Ich starte im repeat-Teil mit Com-Nr: 1 --> im Init-Teil wird nur der Port geöffnet und bei StartAccel wird ein 'G' an den Port geschickt, der wenn der Port verfügbar ist ein OnTriggerAvail-Event auslöst....dort hab ich mal zu Testzwecken einen Breakpoint gesetzt. Dort soll später dann mal eine Abbruchbedingung eingebaut werden, wenn es der richtige Port ist. Ganz interessieren würde mich, wie man in der repeat-Schleife so einen Timeout abwarten kann, denn auch wenn es der richtige Port ist, der Event wird erst zeitverzögert ausgelöst. In diesem Zeitraum muß ich die repeat-Schleife allerdings anhalten, denn sonst bin ich schon längst bei einer weit höheren Port-Nr, als jener die ursprünglich den Event ausgelöst hat!! Bitte nochmals um geniale Ideen.... :wink: LG Thomas |
Re: Dynamisch ComPort ermitteln...
Erstmal ein servus! :hi:
Doch, ich arbeite mit einem RocketPort mit bis zu 16 zusätzlichen Ports! (alles RS232 oder RS485) Über die Ports werden u.a. Scanner von verschiedenen Herstellern angesteuert. Den Anwender das entscheiden zulassen ist hier eine gewagte sache! 1. Zuviele möglichkeiten 2. Scanner sind zuähnlich 3. der Anwender ist zulangsam und spätestens nach dem zweiten mal völlig genervt! Wir steuern Anlagen damit. Die PC´s steuern meißt die gleiche Anlage über einen längeren Zeitraum. Eine vollautomatische einstellung hat noch keinen sinn gemmacht. Aber: Beim installieren der PC´s werden die Scanner nach ihrer Kennung oder Versionsnummer gefragt! Mit der INFO kann dann der PC Konfiguriert werden. Zitat:
lange rede gar kein sinn : beim möglichen port selbst fragen was dran ist! :spin2: |
Re: Dynamisch ComPort ermitteln...
USB und ComPorts deshalb, weil jeder USB-Anschluß letztendlich über eine ComPort-Nummer angesprochen wird....
|
Re: Dynamisch ComPort ermitteln...
Danke für die Idee! :thumb:
das nahe liegt sofern... ich werd mich drann machen und eine Vollautomatische Version schreiben... :mrgreen: |
Re: Dynamisch ComPort ermitteln...
Das Thema kann ich deshalb nicht dem User überlassen, weil wie ich schon oben ausgeführt hatte, der User damit überfodert sein wird. Ich hab selber den Test gemacht:
Steck mal den USB-Hub an einen anderen USB-Anschluß am PC und das Windows vergibt für die Anschlüsse am Hub bereits andere Nummern. Jetzt wird es immer wiedermal passieren, daß der Anwender halt mal einen anderen USB-Anschluß für seinen Hub wählt und dann müßte er jedesmal wieder neue ComPort-Nr. vergeben?? Das kanns nicht sein.... Es geht auch von da her nicht, weil der Hub in der Zwischenzeit wiedermal abgesteckt wird und unterschiedliche Personen darauf arbeiten werden und das dann jemand den Hub an einen anderen USB-Anschluß anschließt ist vorprogrammiert. Darum mein Posting!! |
Re: Dynamisch ComPort ermitteln...
Zitat:
Es bleibt nur die Moeglichkeit die Geraete via RS232 zu fragen. Wenn sie ein Info-Kommando haben, dann geht es. Von ![]() |
Re: Dynamisch ComPort ermitteln...
Hallo Experten!!
Wenn ich einen Char an den ComPort schicke, wird OnTriggerAvail ausgelöst, wenn der ComPort verfügbar ist. Gibt es einen Trigger der auf das Senden eines Chars reagiert, auch wenn der Port nicht verfügbar ist?? LG Thomas |
Re: Dynamisch ComPort ermitteln...
Hallo Bingo72,
imho dürfte ein Open auf einen nicht vorhandenen (aktiven?) Port eine Exception auslösen. Er läßt sich gar nicht erst öffnen. Somit erübrigt sich jedes weitere Ereignis. Ist der Port vorhanden, so kannst du ihn sicher öffnen. Danach stelt sich die Frage, wie erkenne ich meine Endgeräte. Ich rate aber zur Vorsicht mit dem Senden auf den Port so lange nicht klar ist, was dran hängt. Du kannst nicht wissen was dein Kunde alles an den Ports für Endgeräte hat. Können die deine Prüfzeichen ab? Was machen die damit? Du kannst sicher alles voreinstellen (Baud, Parität ...) wenn du glaubst den richtigen gefunden zu habe. Eine Bestätigung durch den User ist imho nie verkehrt. Also wie gesagt, senden deine Geräte automatisch nach dem Connecten infos, so kannst du recht sicher das Endgerät erkennen und deine automatische Auswahl treffen ohne einen eigenen Init. Ich hoffe nur, dein Kunde nutzt nicht noch andere Endgeräte gleicher Machart für andere Anwendungen an den Ports (z.B. 2. GPS-Maus). Dann klaust du unter Umständen anderen die Hardware :mrgreen: Gruß oki |
Re: Dynamisch ComPort ermitteln...
Hallo Oki!!
Deine Bedenken sind berechtigt und einen kurzen Auswahl-Dialog einzubauen ist sicher eine Überlegung wert. Andererseits wenn jemand wirklich z.b. eine 2.GPS-Maus angeschlossen hat....naja??!! :wink: LG Thomas |
Re: Dynamisch ComPort ermitteln...
Da ich noch relativ neu auf dem Gebiet bin wollte ich auch noch Fragen, wie man am Besten weitere Infos über den jeweiligen Sensor herausfindet, um sie unterscheiden zu können?? Passiert das mit einer Funktion die AsyncPro zur Verfügung stellt oder wie sonst??
Bitte um sachdienliche Hinweise erbeten an Kripo... :stupid: LG Thomas |
Re: Dynamisch ComPort ermitteln...
Delphi-Quellcode:
Damit ermittel ich alle Comports im System.
sl := TStringlist.Create;
try reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKeyReadOnly('hardware\devicemap\serialcomm'); reg.GetValueNames(sl); reg.CloseKey; finally FreeAndNil(reg); end; finally FreeAndNil(sl); end; |
Re: Dynamisch ComPort ermitteln...
Hallo!!
Hab jetzt mal den Code ausprobiert und dann die StringList ausgelesen....meine besetzten Com-Schnittstellen sind COM3 und COM6, bekomme aber Serial0, Serial2 und Serial3 zurück...irgendwas paßt nicht??!! LG Thomas |
Re: Dynamisch ComPort ermitteln...
Sorry hatte die falsche Funktion erwischt, da fehlte noch einiges ...
Delphi-Quellcode:
sl := TStringlist.Create;
try reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKeyReadOnly('hardware\devicemap\serialcomm'); reg.GetValueNames(sl); SetLength(fComPort, Length(sl)); for i := 0 to sl.Count - 1 do begin fComPort[i].Name := reg.ReadString(sl[i]); fComPort[i].Details := sl[i]; end; reg.CloseKey; finally FreeAndNil(reg); end; finally FreeAndNil(sl); end; |
Re: Dynamisch ComPort ermitteln...
Danke!!
fComPort is was?? String?? Array?? |
Re: Dynamisch ComPort ermitteln...
Delphi-Quellcode:
type TComPort = record
Name : string; Details : string; end; fComport : array of TComPort; |
Re: Dynamisch ComPort ermitteln...
Danke!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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