Entwickler-Ecke

Windows API - ComPort von eingesteckten USB Seriall Adapter herausfinden


daywalker0086 - Mi 02.07.14 16:52
Titel: ComPort von eingesteckten USB Seriall Adapter herausfinden
Hallo Leute,
ist es möglich den Comport eines gerade angesteckten USB Seriell Wandlers heraustzufinden( natürlich automatisch)?
mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TPS_Settings.FormShow(Sender: TObject);
var
sl: TStringList;
reg: TRegistry;
i :integer;

 fComport : array of TComPort;
begin
ComPort_cb.Clear;
sl := TStringlist.Create;
   try
     reg := TRegistry.Create;
     try
       reg.RootKey := HKEY_LOCAL_MACHINE;
       reg.OpenKeyReadOnly('hardware\devicemap\serialcomm');
       reg.GetValueNames(sl);
       
       SetLength(fComPort, sl.Count);
       for i := 0 to sl.Count - 1 do begin
         fComPort[i].Name := reg.ReadString(sl[i]);
         fComPort[i].Details := sl[i];
         ComPort_cb.Items.Add(reg.ReadString(sl[i]));
       end;
       reg.CloseKey;

     finally
       FreeAndNil(reg);
     end;
   finally
     FreeAndNil(sl);
   end;
end;


kann ich mir ja schonmal die verfügbaren Comport anzeigen lassen aber mir fehlt dei Verknüpfung zum USB Gerät. Wo steht die Verknüpfung USB Gerät 1 hat Comport1?
Kann mir da jemand helfen?
Ich stelle mir das so vor das eine Aufforderung erscheint das Gerät einzustecken und danach wird eben der Comport des Gerätes ausgelesen und meinem Programm zugewiesen.


GuaAck - Do 03.07.14 00:26

Hallo Daywalker0086,

eine gute Antwort würde mich auch interessieren. Ich hatte vor 5 Jahren das Problem, Daten über einen COM-Port von einem Messgerät einzulesen. Alles bestens an meinem damaligen Tower-Pc, aber mein damals neues Notebook hatte dann keine COM-Schnittstelle mehr. Ein USB-COM-Adapter (1xCOM) ging gut, aber mein Messgerät war aus PC-Sicht nicht immer an dem gleichen COM-Port angeschlossen.

Ich bin damals zu dem Schluss gekommen, dass es nicht gehen kann: Ich könnte ohne Probleme zwei USB-COM-Adapter an mein Notebook anschließen. Windows hätte keine Chance, heraus zu finden, an welchem COM-Port mein Messgerät hängt. Vielleicht geht ja plug-and-play auch für über COM angeschlossene Geräte, da kenne ich mich nicht aus, jedenfalls meine Messgeräte können das nicht.

Meine Lösung: Ich suche an allen bekannten COM-Ports nach meinem Messgerät. Dazu muss ich zwar alle bekannetn COMs verstellen, aber da da ohnehin nichts angeschlossen ist schadet das nicht.

Bin gespannt auf andere Antworten.

Gruß GuaAck


Delete - Do 03.07.14 06:41

COM Ports im System auslesen
http://www.delphipraxis.net/118592-com-ports-im-system-auslesen.html
http://www.delphipraxis.net/811647-post3.html

COM-Schnittstelle: Gerätenamen ermitteln
http://www.delphipraxis.net/128285-com-schnittstelle-geraetenamen-ermitteln.html
http://www.delphipraxis.net/873805-post6.html


Martok - Do 03.07.14 09:23

Zusammen mit den ersten Links von user profile iconhathor: Frag halt den User :roll:

COM ist eben stateless, selbst wenn du enumerierst kommst du nicht viel weiter als "der USB-Adapter ist reingesteckt". Ob auf der andern Seite was ist, kannst du nicht wissen. Gut, theoretisch könnte man da mit den Steuerleitungen etwas kodieren, aber das ist dann halt auch nur für ein Gerät möglich, bei dem man die Hardware kontrolliert.
Einfach was senden und gucken was passiert kann übrigens auch schön schiefgehen, falls doch mal zufällig was anderes dran hängt ;)


OlafSt - Do 03.07.14 11:01

Nur weil ein USB-Port zu einem seriellen Port umfunktioniert wird, heißt das noch lange nicht, das man all den nützlichen Komfort von USB-geräten auch bekommt. Ein serieller Port ist ein serieller Port mit all seinen Limitierungen. Man weiß nur, das da einer ist und bestenfalls noch seine Ü-Parameter. Aber das wars dann auch.

Es gibt also keine Lösung für den Wunsch des TE, außer dem genannten (und mit nicht unerheblichen Nachteilen verbundenen) Senden von Testnachrichten an den Port.


uall@ogc - Do 03.07.14 13:38

Der Threadersteller hat doch eine ganz andere Frage gestellt...
Klar kann man von dem USB-Adapter auf den COM-Port schließen und umgekehrt. Ausserdem kann man so auch das Gerät ermitteln, wenn dieses fest mit dem Adapter verbunden ist (also 1 Adapter für genau 1 Gerät).

Das geht z.B. über die Registry (bei FTDI z.B. "SYSTEM\CurrentControlSet\Enum\FTDIBUS" und "\USB" ggf. mehr) oder eine Library vom USB-Seriell-Adapter (bei FTDI z.b. "FTD2XX.dll")


Martok - Do 03.07.14 13:56

user profile iconuall@ogc hat folgendes geschrieben Zum zitierten Posting springen:
Der Threadersteller hat doch eine ganz andere Frage gestellt...
Klar kann man von dem USB-Adapter auf den COM-Port schließen und umgekehrt.
Stimmt natürlich. Allgemein könnte man das mit dem oben verlinkten Enumerier-Code machen, nach Device-Namen filtern und hat was.


daywalker0086 - Do 03.07.14 17:17

ICh habe es jetzt mit meinem oben geposteten Code so gelöst das der anwender aufgefordert wird den Adapter einzustecken. Dann wird verglichen was vorher nicht da war und fertig. Klappt! :-)