Forum: PC-Programmierung Namen der Com Schnittstellen in VB auflisten


von ...bettina.... (Gast)


Angehängte Dateien:

Lesenswert?

hallo leute,

ich habe ich vb eine funktion, die mir alle verfügbaren com 
schnittstellen auflistet. jedoch nur in der form com 1, com 2, com 3... 
(IO.Ports.SerialPort.GetPortNames())

ich wollte aber genau den namen des verfügbaren gerätes an der 
schnittstelle.
siehe anhang!

also das ich ausgegeben bekomme "UART to USB..."

von Sebastian B. (mircobolle)


Lesenswert?

...bettina.... wrote:
> hallo leute,
>
> ich habe ich vb eine funktion, die mir alle verfügbaren com
> schnittstellen auflistet. jedoch nur in der form com 1, com 2, com 3...
> (IO.Ports.SerialPort.GetPortNames())
>
> ich wollte aber genau den namen des verfügbaren gerätes an der
> schnittstelle.
> siehe anhang!
>
> also das ich ausgegeben bekomme "UART to USB..."


Soweit ich weiss kannst du über die Windows API nur auf die Ordinalen 
Bezeichnungen der Schnittstelle Com1, Com2 zugreifen.

Windows ist ja auch eigentlich nicht bekannt was für ein Gerät an der 
Com Schnittstelle hängt. Bei mir z.B. hängt ein SCI-to-CAN Adapter an 
der Com Schnittstelle und dies wird im Geräte Manager bei mir nicht 
abgezeigt. Woher soll es Windows auch wissen? Wenn dann musst du einen 
speziellen Treiber installieren, der Windows mitteilt, dass COM1 jetzt 
nicht mehr COM1 heisst sondern 
"serielle_bit_schuppser_leitung_zur_generierung_lustiger_klingeltoene" 
oder so ;-)

von Jaecko (Gast)


Lesenswert?

Diese Info müsste man doch aus der jeweiligen .inf rausholen können. 
Dort steht ja die VID/PID drin, die das Gerät identifiziert. Ebenso 
steht dort dann auch der Name, wie das Teil im Gerätemanager angezeigt 
werden soll.
Man müsste also dazu "nur" noch rausfinden, welche .inf (sofern 
überhaupt vorhanden) zu welchem COM-Port gehört.

von Codehamster (Gast)


Lesenswert?

je nach VB version die du brauchst...

Bei den älteren VB versionen (noch nicht .NET) gings so:

Eine Möglichkeit durch die von dir genannte Funktion kriegst du alle 
möglichen Ports. Dann schreib dir eine Routine welche versucht die Ports 
zu öffnen. Falls erfolgreich, Port wieder schliessen und in Array (menu) 
abfüllen. Fall nicht erfolgreich port schliessen und zum nächsten Port 
gehen.

Anosnsten bemüh bitte eine Suchmaschine, hab da auch die Lösung zu 
diesem Problem gefunden. Jedoch habe ich sie nicht mehr zu 100% präsent.

MFG Codehamster

von Codehamster (Gast)


Lesenswert?

Sorry, bin wohl noch nicht richtig wach. Habe dich missverstanden. wie 
du auf den Namen des jeweiligen Gerätes kommst weiss ich leider nicht!

von ...bettina.... (Gast)


Lesenswert?

na ich habe an ein avr controller mit usb ausgang am rechner. dieser 
installiert einen virtuellen port (port 5). und dann steht dort halt der 
name, siehe anhang "USB to UART Bridge".

ich wollte nun diesen namen dieses angeschlossenen teils in visual basic 
auslesen.

von Sebastian B. (mircobolle)


Lesenswert?

...bettina.... wrote:
> na ich habe an ein avr controller mit usb ausgang am rechner. dieser
> installiert einen virtuellen port (port 5). und dann steht dort halt der
> name, siehe anhang "USB to UART Bridge".
>
> ich wollte nun diesen namen dieses angeschlossenen teils in visual basic
> auslesen.

google mal nach: VB get/read virutal port names

von René K. (king)


Lesenswert?

Hallo Sebastian!

Sebastian B. wrote:
> Soweit ich weiss kannst du über die Windows API nur auf die Ordinalen
> Bezeichnungen der Schnittstelle Com1, Com2 zugreifen.

Das ist falsch, für soetwas gibt es das SetupAPI. Damit geht das ganz 
einfach, siehe: http://msdn.microsoft.com/en-us/library/ms791318.aspx

Hier mal ein kleines Beispiel, wie man an den FriendlyName gelangen 
kann:
1
#include <windows.h>
2
#include <tchar.h>
3
#include <setupapi.h>
4
#include <devguid.h>
5
#include <cstdio>
6
7
BOOL EnumPorts()
8
{
9
    PSP_DEVICE_INTERFACE_DETAIL_DATA    pspdidd;
10
    SP_DEVICE_INTERFACE_DATA            spdid;
11
    SP_DEVINFO_DATA                     spdd;
12
    HDEVINFO                            hDevInfo;
13
    DWORD                               dwIndex, dwSize, dwType;
14
    TCHAR                               szProperty[256];
15
    GUID                                guid;
16
17
    ZeroMemory(&spdid, sizeof(spdid));
18
    spdid.cbSize = sizeof(spdid);
19
20
    guid = GUID_DEVCLASS_PORTS;
21
    
22
    if(INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT)))
23
    {
24
        _tprintf(TEXT("SetupDiGetClassDevs failed, Error %u\n"), GetLastError());
25
        return(FALSE);
26
    }
27
28
    for(dwIndex = 0; (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &spdid)); dwIndex++)
29
    {
30
        _tprintf(TEXT("Geraete-Index: %u\n"), dwIndex);
31
32
        dwSize = 0;
33
        SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);
34
35
        if(dwSize)
36
        {
37
            if(NULL == (pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new BYTE[dwSize]))
38
                continue;
39
40
            pspdidd->cbSize = sizeof(*pspdidd);
41
            
42
            ZeroMemory(&spdd, sizeof(spdd));
43
            spdd.cbSize = sizeof(spdd);
44
45
            if(SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd))
46
            {
47
                _tprintf(TEXT("Name fuer CreateFile(): %s\n"), pspdidd->DevicePath);
48
49
                if(SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_FRIENDLYNAME, &dwType, (BYTE*)szProperty, sizeof(szProperty), NULL))
50
                {
51
                    if(dwType == REG_SZ)
52
                    {
53
                        _tprintf(TEXT("FriendlyName: %s\n"), szProperty);
54
                    }
55
                }
56
            }
57
58
            delete [] pspdidd;
59
        }
60
    }
61
62
    SetupDiDestroyDeviceInfoList(hDevInfo);
63
    return(TRUE);
64
}

von Sebastian B. (mircobolle)


Lesenswert?

René König wrote:
> Hallo Sebastian!
>
> Sebastian B. wrote:
>> Soweit ich weiss kannst du über die Windows API nur auf die Ordinalen
>> Bezeichnungen der Schnittstelle Com1, Com2 zugreifen.
>
> Das ist falsch, für soetwas gibt es das SetupAPI. Damit geht das ganz
> einfach, siehe: http://msdn.microsoft.com/en-us/library/ms791318.aspx

Hallo René, deshalb schrieb ich ja "soviel ich weiss" ;-) Aber jetzt bin 
ich auch schlauer und weiss, dass es doch geht!

> Hier mal ein kleines Beispiel, wie man an den FriendlyName gelangen
> kann:
Hier Bettina, René hat dir soeben die Lösung für dein Problem geliefert!

have fun

von Rolf R. (ultra-low)


Lesenswert?

hallo ...bettina....

hast du es hingekriegt ?

ich habe nun die gleiche aufgabestellung. vollstaniger gerätename vom 
seriellem port in vb.net. nun werde ich aus dem hier geschriebenen nicht 
schlau.
darum möchte ich die frage noch mal stellen. wie kommt man an den 
vollständigen namen von com´s.

gruss

von Florian (Gast)


Lesenswert?

Falls noch einer das gleiche Problem hat, hier eine Lösung die 
Funktioniert:

Als erstes unter ->Projekt->Verweise hinzufügen... System.Management 
hinzufügen.

Dann hier der Code:
1
Imports System.Management
2
3
    Public Function GetSerial()
4
        Dim queryA As String = "Select * from Win32_SerialPort"
5
        Dim pd As PropertyData
6
        Dim Device_Name As String = "Device-Name"
7
        'Im Beispiel hier müsste dann folgendes da stehen:
8
        'Dim Device_Name As String = "CP210x USB to UART Bridge Controller"
9
        Dim Found_Device As Boolean = False
10
        Dim Port As String = ""
11
12
        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(queryA)
13
        Dim moc As ManagementObjectCollection = mos.Get()
14
        For Each mo As ManagementObject In moc
15
            For Each pd In mo.Properties
16
                On Error Resume Next
17
                If pd.Name.ToString() = "Description" Then
18
                    If pd.Value.ToString() = Device_Name Then
19
                        Found_Device = True
20
                    Else
21
                        Found_Device = False
22
                    End If
23
                End If
24
                If Found_Device = True And pd.Name.ToString() = "DeviceID" Then
25
                    Port = pd.Value.ToString()
26
                    mos.Dispose()
27
                    moc.Dispose()
28
                    GC.Collect()
29
                    Return Port
30
                End If
31
            Next
32
        Next
33
        mos.Dispose()
34
        moc.Dispose()
35
        GC.Collect()
36
        Return "Device Not Found"
37
38
    End Function

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.