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..."
...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 ;-)
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.
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
Sorry, bin wohl noch nicht richtig wach. Habe dich missverstanden. wie du auf den Namen des jeweiligen Gerätes kommst weiss ich leider nicht!
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.
...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
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 | }
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.