Hallo Leute,
ich habe eine kurze Frage zu Visual-Baisc. Ich habe mir ein kleines
Terminal geschrieben, mitdem ich meine Geräte ansprechen und
Firmwareupdates durchführen kann. Da diese Geräte überwiegend alle
Bluetoothmodule besitzen, verbinde ich mich über COM-Ports.
Jetzt zu meinem Problem: Das Bluetoothmodul erstellt immer 2 COM-Ports
(einen "echten" und einen "virtual", schätze ich mal). Es geht nur einer
davon; in der Verbindungsliste werden aber alle angezeigt - so muss man
erst immer durch testen welcher das ist (das Terminal erkennt nach
verbinden, ob er "echt" ist, und ob das passende Gerät dran hängt, sonst
wird er automatisch geschlossen und eine Fehlermeldung ausgegeben).
- Ist es möglich, direkt nur in der Liste die richtigen Com-Ports
anzuzeigen?
Zweite Frage:
- Bei vielen Geräten hat man zwangsläufig viele COM-Ports in der Liste;
ich dachte mir, da Windows ja auch den Namen des Gerätes weiß (also den
Namen des Bluetoothmoduls) und daraus irgendwie eine Zuweisung tätigt
zum COM-PORT sollte es doch möglich sein, in der Verbindungsliste nicht
nur COM1 bis COMn anzuzeigen, sondern den Bluetoothmodulnamen (bspw:
COM1 (meinGeraet))?
Weiß jmd. wie und ob das möglich ist?
Meine USB Geräte und virtuelle COM Ports erkenne ich mittels dem WMI
Service.
Der Code fängt so an:
Try
oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")
For Each iDvc In collDvcs
.
.
.
Mit dem Service bekommt man alle möglichen Systeminformationen.
Hallo Einhart,
das hört sich schonmal ganz Interessant an, brauche ich dafür eine .dll
oder kann ich das über eine .lib einbinden?
Weißt du ob ich dort auch den Bluetoothnamen direkt einem COM-PORT
zuordnen kann? Unter Systemsteuerung ist dieses nämlich nicht zu sehen.
Ich kenne dieses WMI noch gar nicht, wie kann ich denn die 2 COM-PORTs
vom Bluetoothmodul differenzieren?
Moin Marius,
Eine DLL benötigst du nicht. System.Management muss impotiert werden
Imports System.Management
Im Bezug auf Bluetooth habe ich keine Erfahrung. Ich nehme an dass die
dafür nötigen Informationen auch dabei sind. Einfach 'mal die Devices im
Debug durchgehen und anschauen welche Infos enthalten sind.
Oder die Stichwörter googlen: vb.net WMI bluetooth
Bei den USB VCOM Ports sehe ich neben PID und VID die Seriennummern der
Geräte. Damit kann ich auch gleiche Geräte identifizieren.
Hallo Enhart,
ich bin nicht so der PC-Programmierer, ich habe ehrlich gesagt keine
Ahnung wonach ich suchen muss.
Du hattest mir so einen kleinen Code Schnipsel gegeben - könnte ich
davon einen ganzen Auszug bekommen um mal zu testen was ich dort
zurückgeliefert bekomme?
Du kannst ja zunächst mal die "for each"-Schleife vervollständigen und
Dir dann im Debugger ansehen, was iDvc jeweils an Informationen enthält.
Ja, auch VB hat so etwas.
Versuch's hiermit (ein Formular mit einer Multiline-Textbox:
Imports System.Management
Public Class Form1
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles
Me.Shown
Dim oWMISrv, collDvcs
Try
oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")
For Each iDvc In collDvcs
TextBox1.Text = TextBox1.Text & iDvc.Caption & vbCrLf
TextBox1.Text = TextBox1.Text & " - " & iDvc.DeviceID & vbCrLf &
vbCrLf
Next
Catch
MsgBox("DeviceInfo", vbCritical, Err.Description)
End Try
End Sub
End Class
Das sollte dir einiges an Systeminformationen zeigen. Das ist nur ein
kleiner Teil der mit WMI Abfragemöglichkeiten.
Hallo bluppdidupp & Einhart,
den Link den du mir geschickt hast ist super; das Programm ist Klasse,
nun kann ich wenigstens mal gucken wonach ich suche - dein Quellcode ist
tlws. dadrin auch enthalten, Einhart.
Problem: DeviceID liefert mir die COM1-COMn (das geht auch mit
.getPortNames())
Ich habe mir alle Funktionen was unter SerialPort gelistet war
angeguckt. Ich bekomme dort aber leider nur die Namen wie im Geräte
Manager zu sehen (Standartmäßige Serial-über-Bluetooth-Verbindung). So
heißen die halt alle :(
Was ich gerne sehen wollte, war der Name des Gerätes, wenn man auf das
Bluetoothsymbol 2x klickt und dann unter PC & Geräte -> Bluetooth
[Windows 8.1]. Dort stehen dann die gekoppelten Geräte mit Ihrem Namen.
Wie kann ich den denn bekommen (zugewiesen auf einen Port)?
Der Code von Einhart liefert diese Namen, allerdings nicht in Bezug zu
dem COM-PORT :|. Auf jedenfall schonmal einen Schritt weiter, danke dir.
Jetzt wäre noch super, wenn ich dazu irgendwie den Com-Port herausfinden
könnte.
Ich bekomme durch Einharts Quellcode den Namen und die Seriennummer -
vll. kann ich jetzt die Seriennummer vom Com-Port auslesen und das
vergleichen - ich werde es mal testen und mich wieder melden!
Hi Einhart
ich habe jetzt mal einiges versucht. Ich bekomme von deinem Quellcode
die ID und den echten Bluetoothnamen - dann bekomme ich noch als
komplett anderen Eintrag einen COM-PORT und eine andere ID.
Ich dachte die beiden IDs seien gleich -> dann hätte ich PORT einfach
dem Namen zuweisen können. Nun merke ich gerade das das unterschiedlich
ist.
Bspw. diese beiden Teile gehören zusammen - jetzt müsste ich noch in
Software herausfinden, dass diese zusammengehören und könnte das dann
zuweisen und in der Gerätebox listen (z. Zt. stehen dort halt nur die
COM1-COMn, man weiß halt nicht welcher jetzt für bspw. HouseControl
ist).
So,
ich danke euch für eure Hilfe!!
Ich poste hier mal meinen (fast) fertigen Quellcode der Funktion, welche
ausließt und die zusammengefügten Namen und Com-Port in einer Funktion
als Array zurückgibt. Momentan ausschließlich Bluetooth - USB habe ich
noch keine Geräte, würde dann aber aktualisiert werden. Man kann die
Funktion aufrufen, und dann bspw. für eine Combo-Box nutzen. Vll. hat ja
jmd. ein ähnliches Problem und kann es gebrauchen.
1
Public Function GetPortAndIDNames() As String()
2
Dim oWMISrv, collDvcs
3
Const SizeOF = 9999 'max devices
4
Dim DeviceIDNAME As String
5
Dim DeviceCOM_ID(SizeOF) As String
6
Dim DeviceID_NAME(SizeOF) As String
7
Dim SerialPortDevices(SizeOF) As String
8
Dim runs(5) As Integer
9
Dim BufferID As String()
10
Dim bufStrNM As String()
11
Dim bufStrPT As String()
12
13
'Get and combine Objekts
14
Try
15
oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
16
collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity")
17
18
For Each iDvc In collDvcs
19
DeviceIDNAME = iDvc.Caption & "{" & iDvc.DeviceID
20
21
'get only Bluetooth Devices, NO USB
22
If (InStr(1, DeviceIDNAME, "Seriell") > 0 Or InStr(1, DeviceIDNAME, "Serial") > 0 Or InStr(1, DeviceIDNAME, "BTHENUM\DEV") > 0) And InStr(1, DeviceIDNAME, "BTHENUM") > 0 Then
23
If InStr(1, DeviceIDNAME, "COM") > 0 Then
24
DeviceCOM_ID(runs(0)) = DeviceIDNAME
25
'MsgBox(DeviceCOM_ID(runs(0)))
26
runs(0) = runs(0) + 1
27
Else
28
DeviceID_NAME(runs(1)) = DeviceIDNAME
29
'MsgBox(DeviceID_NAME(runs(1)))
30
runs(1) = runs(1) + 1
31
End If
32
End If
33
Next
34
Catch
35
End Try
36
37
For lauf As Integer = 0 To (runs(1) - 1) Step 1
38
39
BufferID = DeviceID_NAME(lauf).Split("{") 'split out of name
40
BufferID = BufferID(1).Split("_") 'split for ID
41
42
For lauf2 As Integer = 0 To (runs(0) - 1) Step 1
43
44
'Test Namespace
45
If InStr(1, DeviceCOM_ID(lauf2), BufferID(2)) > 0 Then 'ID in Namespace?