mikrocontroller.net

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


Autor: ...bettina.... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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..."

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Jaecko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Codehamster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Codehamster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ...bettina.... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: René König (king)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <windows.h>
#include <tchar.h>
#include <setupapi.h>
#include <devguid.h>
#include <cstdio>

BOOL EnumPorts()
{
    PSP_DEVICE_INTERFACE_DETAIL_DATA    pspdidd;
    SP_DEVICE_INTERFACE_DATA            spdid;
    SP_DEVINFO_DATA                     spdd;
    HDEVINFO                            hDevInfo;
    DWORD                               dwIndex, dwSize, dwType;
    TCHAR                               szProperty[256];
    GUID                                guid;

    ZeroMemory(&spdid, sizeof(spdid));
    spdid.cbSize = sizeof(spdid);

    guid = GUID_DEVCLASS_PORTS;
    
    if(INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT)))
    {
        _tprintf(TEXT("SetupDiGetClassDevs failed, Error %u\n"), GetLastError());
        return(FALSE);
    }

    for(dwIndex = 0; (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &spdid)); dwIndex++)
    {
        _tprintf(TEXT("Geraete-Index: %u\n"), dwIndex);

        dwSize = 0;
        SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);

        if(dwSize)
        {
            if(NULL == (pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new BYTE[dwSize]))
                continue;

            pspdidd->cbSize = sizeof(*pspdidd);
            
            ZeroMemory(&spdd, sizeof(spdd));
            spdd.cbSize = sizeof(spdd);

            if(SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd))
            {
                _tprintf(TEXT("Name fuer CreateFile(): %s\n"), pspdidd->DevicePath);

                if(SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_FRIENDLYNAME, &dwType, (BYTE*)szProperty, sizeof(szProperty), NULL))
                {
                    if(dwType == REG_SZ)
                    {
                        _tprintf(TEXT("FriendlyName: %s\n"), szProperty);
                    }
                }
            }

            delete [] pspdidd;
        }
    }

    SetupDiDestroyDeviceInfoList(hDevInfo);
    return(TRUE);
}

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Riller (ultra-low)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Imports System.Management

    Public Function GetSerial()
        Dim queryA As String = "Select * from Win32_SerialPort"
        Dim pd As PropertyData
        Dim Device_Name As String = "Device-Name"
        'Im Beispiel hier müsste dann folgendes da stehen:
        'Dim Device_Name As String = "CP210x USB to UART Bridge Controller"
        Dim Found_Device As Boolean = False
        Dim Port As String = ""

        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(queryA)
        Dim moc As ManagementObjectCollection = mos.Get()
        For Each mo As ManagementObject In moc
            For Each pd In mo.Properties
                On Error Resume Next
                If pd.Name.ToString() = "Description" Then
                    If pd.Value.ToString() = Device_Name Then
                        Found_Device = True
                    Else
                        Found_Device = False
                    End If
                End If
                If Found_Device = True And pd.Name.ToString() = "DeviceID" Then
                    Port = pd.Value.ToString()
                    mos.Dispose()
                    moc.Dispose()
                    GC.Collect()
                    Return Port
                End If
            Next
        Next
        mos.Dispose()
        moc.Dispose()
        GC.Collect()
        Return "Device Not Found"

    End Function


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.