Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dynamisch ComPort ermitteln... (https://www.delphipraxis.net/86946-dynamisch-comport-ermitteln.html)

bingo72 21. Feb 2007 13:46


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

SirThornberry 21. Feb 2007 13:47

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.

bingo72 21. Feb 2007 14:24

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:

bingo72 22. Feb 2007 06:44

Re: Dynamisch ComPort ermitteln...
 
Hatte noch keiner dieses Problem??

oki 22. Feb 2007 07:00

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

alzaimar 22. Feb 2007 07:09

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?

bingo72 22. Feb 2007 07:20

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:
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;
Kurz zur Erklärung:
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

yörsch 22. Feb 2007 07:22

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:

Zitat von oki
Das setzt voraus, dass deine Geräte nach öffnen des Ports automatisch Daten schicken.

davon kann mann nicht leider nicht immer ausgehn... auch bei USB!
lange rede gar kein sinn : beim möglichen port selbst fragen was dran ist! :spin2:

bingo72 22. Feb 2007 07:23

Re: Dynamisch ComPort ermitteln...
 
USB und ComPorts deshalb, weil jeder USB-Anschluß letztendlich über eine ComPort-Nummer angesprochen wird....

yörsch 22. Feb 2007 07:30

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:

bingo72 22. Feb 2007 07:31

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!!

Robert Marquardt 22. Feb 2007 09:18

Re: Dynamisch ComPort ermitteln...
 
Zitat:

Zitat von yörsch
davon kann mann nicht leider nicht immer ausgehn... auch bei USB!
lange rede gar kein sinn : beim möglichen port selbst fragen was dran ist! :spin2:

Waere es ein USB-Geraet, dann koennte man ja sicher Informationen herausbekommen, aber dies sind RS232-Geraete. Der USB dient ja nur als Tunnel fuer den RS232.
Es bleibt nur die Moeglichkeit die Geraete via RS232 zu fragen. Wenn sie ein Info-Kommando haben, dann geht es.

Von http://jedi-apilib.sf.net die Module win32api und scapi holen. In scapi ist ein Beispiel wie man serielle Schnittstellen unter XP sauber enumeriert.

bingo72 22. Feb 2007 12:46

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

oki 22. Feb 2007 16:51

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

bingo72 23. Feb 2007 06:30

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

bingo72 23. Feb 2007 08:02

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

hitzi 23. Feb 2007 08:37

Re: Dynamisch ComPort ermitteln...
 
Delphi-Quellcode:
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;
Damit ermittel ich alle Comports im System.

bingo72 23. Feb 2007 09:34

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

hitzi 23. Feb 2007 09:52

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;

bingo72 23. Feb 2007 09:59

Re: Dynamisch ComPort ermitteln...
 
Danke!!

fComPort is was?? String?? Array??

hitzi 23. Feb 2007 10:03

Re: Dynamisch ComPort ermitteln...
 
Delphi-Quellcode:
type TComPort = record
       Name : string;
       Details : string;
end;

fComport : array of TComPort;

bingo72 23. Feb 2007 10:10

Re: Dynamisch ComPort ermitteln...
 
Danke!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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