Forum: PC-Programmierung Auslesen des COM-Ports eines Bluetooth-Gerätes


von Matt B. (mattb)


Lesenswert?

Hallo zusammen,

ich habe heute ein Bluetooth-Modul an einen Mikrocontroller 
angeschlossen Nun würde ich in einer eigenen Software die unter Windows 
laufen soll den von WIN zugewiesenen COM-Port des Gerätes anhand seines 
Namen automatisch auslesen, damit soll die manuelle Suche des 
zugewiesenen Ports (z.B. im Gerätemanager) ersetzt werden.

Der Name des Modules ist fest definiert.
Sollte doch irgendwie machbar sein.

Danke schon mal.

Gruss Matt

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du könntest ja mal in der Registry nach dem Namen suchen -- und sehen, 
wo Du da dann gelandet bist.
(regedit aufrufen, Ctrl+F drücken, Namen eingeben und suchen lassen)

von Matthias N. (nippey)


Lesenswert?

Hi,
vielleicht hilft das hier.
Ich habe vor einiger zeit mal folgendes Programm gebastelt:
http://nippey.dornuweb.de/index.php?art=15

Hiermit hast du im Tray ein Symbol, über das du die aktuell vorhandenen 
Ports auflisten kannst.

Kann sicher an einigen Ecken verbessert werden, ich freue mich immer 
über Feedback!
Bisher habe ich es erst auf zwei Systemen testen können.

von Matt B. (mattb)


Lesenswert?

@Rufus:
ich habe meine Registry mal nach dem Gerätenamen durchsucht. Ich hab 
zwar etwas gefunden, allerdings konnte ich nichts finden, das mir 
Informationen über den zugewiesenen COM-Port geben könnte.

@Matthias:
das Programm sieht mal nicht schlecht aus. Wenn du es jetzt noch möglich 
wäre, den Namen des Bluetooth-RS232 Adapters anzuzuzeigen, der den 
COM-Port zur Verfügung stellt, wäre das genau das was ich suche.
Hast du das schon mal versucht?

Euch beiden schon mal vielen Dank!

Gruss
Matt

von Matthias N. (nippey)


Lesenswert?

Ich glaube, das war genau die Ecke, an der ich auch damals schon dran 
gekaut habe... ;)

Ich versuche gerne, da noch mal weiter zu machen.

Nur damit wir vom selben 'Namen' reden, bevor ich blind losarbeite, 
kannst du einmal genau beschreiben, wo der von dir gewünschte Name 
angezeigt wird?
(Listeneintrag im Gerätemanager, Name der angezeigt wird wenn das Gerät 
eingesteckt wird, etc.)
Screenshots nehme ich auch gerne.

Ich weiß, dass ich versucht habe, den Namen auszulesen, der bei FTDIs 
(USB-2-UART Konverter) nur kurz angezeigt wird, wenn man ihn in einen 
bis dato noch nicht genutzten USB-Port steckt. Leider (bis jetzt) ohne 
Erfolg.

EDIT:
>@Matthias:
>das Programm sieht mal nicht schlecht aus. Wenn du es jetzt noch möglich
>wäre, den Namen des Bluetooth-RS232 Adapters anzuzuzeigen, der den

>>Bluetooth-RS232
Ein nicht-USB Gerät, das direkt auf den Hardware COMx deines Rechners 
geht? Das könnte schwierig werden. Oder meinst du halt so ein 
USB-Bluetooth-Stick?

von Andreas W. (geier99)


Lesenswert?

Hallo Matt,

hier mal ein paar Stichwörter für Tante Google:
com port friendly name
wmi


Für WMI kannst Du dir ja mal WMIMulti Prog runterladen 
(http://www.tools4net.de/doc/wmimulti.htm)
und dann mal folgnedes probierren:
Namespace: root\CIMV2
Querey-String: SELECT * FROM Win32_PnPEntity WHERE 
(ConfigManagerErrorCode = 0 and Caption like '%(com_%)%' )

ausführen und schauen, ob Dein Modul mit dem bekannten Namen angezeigt 
wird (Feld Caption).


und hier noch ein Auszug meiner VB2010 Express Funktion wie ich die 
Namen der Ports ermittle.
1
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles btnFindPorts.Click
2
        Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_SerialPort")   ' Anfrage für normale COM-Ports
3
        Dim usbSearcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity WHERE (ConfigManagerErrorCode = 0 and Caption like ""%(com_%)%"")")  'Anfrage für virtuelle COM-Ports (USB-Serial)
4
        Dim name As String
5
        Dim portname As String
6
7
        Me.ListBox3.Items.Clear()       ' alle Einträge löschen
8
9
        Me.ListBox3.Items.Add("----------------------------:")
10
        Me.ListBox3.Items.Add("Ergebnis von Win32_SerialPort:")
11
        Me.ListBox3.Items.Add("------------:")
12
        For Each queryObj As ManagementObject In searcher.Get()
13
            name = queryObj("Name")
14
            portname = queryObj("DeviceID")
15
            Me.ListBox3.Items.Add(portname & ": (" & name & ")")
16
            meinePorts(portname) = name
17
        Next
18
19
        Me.ListBox3.Items.Add("---------------------------:")
20
        Me.ListBox3.Items.Add("Ergebnis von Win32_PnPEntity:")
21
        Me.ListBox3.Items.Add("------------:")
22
        For Each queryObj As ManagementObject In usbSearcher.Get()
23
            name = queryObj("Caption").ToString.ToUpper
24
            If InStr(name, "(COM") = 0 Then
25
                Continue For                  ' Kein "(COM" gefunden , weitermachen ohne das Ergenis auszuwerten
26
            End If
27
            portname = name.Substring(InStr(name, "(COM"), 5)
28
            If InStr(portname, ")") > 0 Then   ' Portnummer einstellig?
29
                portname = portname.Substring(0, 4)
30
            End If
31
            meinePorts(portname) = queryObj("Description")
32
33
            Me.ListBox3.Items.Add(portname & ": (" & queryObj("Description") & ")")
34
        Next
35
36
        cmbPort.Items.Clear()       ' alle einträge löschen und nun mit freundlichen Namen füllen
37
38
        For Each kvp As KeyValuePair(Of String, String) In meinePorts
39
            cmbPort.Items.Add(kvp.Key & ": (" & kvp.Value & ")")
40
        Next
41
42
        cmbPort.Text = cmbPort.Items.Item(0)    'Set cmbPort text to the first COM port detected
43
        cmbPort.Text = My.Settings.cmbPortSetting ' falls ein gespeicherter Wert existiert, dasnn diesen nehmen.
44
    End Sub

Gruss Andreas

PS: Damit obiger Code funktioniert müssen die fehlende Objekte (buttons, 
Variablen) noch angelegt werden. Und der Verweis auf die 
System.Management.dll muss eingefügt werden.

von Matt B. (mattb)


Angehängte Dateien:

Lesenswert?

Hallo Matthias,

ich verwende am einem Mikrocontroller ein Bluetooth-UART-Adapter. Dieses 
Modul besitzt einen Namen. Im Screenshot im Anhang ist das Gerät mit dem 
Namen <linvo> aufgeführt. Zu finden ist diese Übersicht unter "Geräte 
und Drucker". Später soll der Modul-Name natürlich etwas eindeutiger 
sein (z.B. mit Geräte-ID).

Nun würde ich gerne den zu dem Bluetooth-Modul mit genau diesem Namen 
den COM-Port auslesen.



Hallo Andreas,

ich werde mich heute Abend mal durch den Code arbeiten und sehen ob ich 
damit weiter komme.


Schon mal vielen Dank für eure Hilfe!

Gruss
Matt

von Matthias N. (nippey)


Lesenswert?

@Andreas W:

Mit WMI Requests arbeitet mein Proggie bereits, vielleicht finde ich bei 
dir ja noch eine Abfrage, die ich bisher nicht genutzt habe ;)

Wusste gar nicht, dass man die WMI Sachen auch per VBS machen kann.., 
zum schnellen probieren absolut nicht verkehrt.

@Matt B.
Die guten alten Linvors von CSR ;)
Ich habe hier nen ganzen Satz dieser Module. Da habe ich ja direkt 
Hardware zum Testen ;)

von Uwe (Gast)


Lesenswert?

> Ich weiß, dass ich versucht habe, den Namen auszulesen, der bei FTDIs
> (USB-2-UART Konverter) nur kurz angezeigt wird, wenn man ihn in einen
> bis dato noch nicht genutzten USB-Port steckt. Leider (bis jetzt) ohne
> Erfolg.
Ganz einfach wie unten gezeigt.
Wobei der name im EEPROM in diesem Beispiel auf "PORT" gesetzt ist. Dann 
kannst du "PORT A" und "PORT B" öffnen, wenn du als Parameter 
FT_OPEN_BY_DESCRIPTION übergibst.

ftSTATUS = FT_OpenEx("PORT A",FT_OPEN_BY_DESCRIPTION,&ftHANDLE);

von Matthias N. (nippey)


Lesenswert?

> ftSTATUS = FT_OpenEx("PORT A",FT_OPEN_BY_DESCRIPTION,&ftHANDLE)
Ist bekannt. Es ging mir aber um eine Modellübergreifende Lösung ;)

Das Programm selber sollte so unabhängig wie möglich sein. Wo ich aber 
schon drüber nachgedacht habe ist eine Art plugin-System. Man füttre 
eine Portnummer ins plugin und dieses gibt eine Beschreibung zurück, 
wenn der Port bekannt ist.
Mal sehen... ;)

von Matthias N. (nippey)


Angehängte Dateien:

Lesenswert?

Hi,

bis ich das mit den BT-Modulen testen kann, dauert es noch etwas, aber 
so schaut die Ausgabe meines Programms zurzeit schon aus.

Das sollte doch das sein, was du suchst?
Wenn ja, dann suche ich mal den Quälcode raus.

@Uwe
Achja, es ging bei den FTDIs aber nicht darum, sie über ihren Namen zu 
öffnen, dieses Problem hat der Threadstarter, bei mir war es das 
Gegenteil, die Description auszulesen, wenn die Portnummer gegeben ist.
Aber die Gründe warum ich mir das Leben so schwer mache, habe ich ja 
bereits einen Beitrag darüber genannt ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.