Seite 1 von 1
Vorhandene COM-Schnittstellen ermitteln
Verfasst: 15.11.2009 11:14
von Hein
Hallo
Ich möchte über eine Auswahl nur die im System tatsächlich vorhandenen seriellen Schnittstellen anbieten.
Bis jetzt habe ich mit Serialportid, isserialport usw. experimentiert aber komme da nicht wirklich weiter.
Hat jemand eine Ahnung wie ich die vorhandenen Ports ermitteln kann ohne sie erst aktivieren zu müssen ?
Danke
Re: Vorhandene COM-Schnittstellen ermitteln
Verfasst: 15.11.2009 21:15
von Crawler
In solch einem Fall versuche ich die Schnittstelle zu öffnen:
Code: Alles auswählen
For i=1 To 20
If OpenSerialPort (0, "COM"+Str(i), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
Debug "COM "+Str(i)+" ok"
CloseSerialPort (0)
Else
Debug "COM "+Str(i)+" not found"
EndIf
Next
Ist vielleicht nicht die schönste, aber durchaus eine brauchbare Lösung.
Re: Vorhandene COM-Schnittstellen ermitteln
Verfasst: 15.11.2009 22:48
von HeX0R
Ich könnte wetten, ich habe das hier schon mal irgendwo so ähnlich gepostet, aber ich finde nix mehr.
Egal:
Code: Alles auswählen
Global NewList AvailableComs()
Procedure GetAvailableComPorts()
Protected hKey, lpcbName, lpName.s, a$, lType, i
If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, #KEY_QUERY_VALUE, @hKey) = #ERROR_SUCCESS
lpName = Space(255)
Repeat
lpcbName = 255
If RegEnumValue_(hKey, i, @lpName, @lpcbName, 0, 0, 0, 0) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName)
If a$ = ""
Break
EndIf
lpcbName = 255
lType = 0
If RegQueryValueEx_(hKey, a$, 0, @lType, @lpName, @lpcbName) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName - 1)
If LCase(Left(a$, 3)) = "com"
AddElement(AvailableComs())
AvailableComs() = Val(RemoveString(a$, "COM", 1))
EndIf
EndIf
i + 1
Else
Break
EndIf
ForEver
RegCloseKey_(hKey)
EndIf
EndProcedure
;-------
GetAvailableComPorts()
ForEach AvailableComs()
Debug "COM" + Str(AvailableComs())
Next
Re: Vorhandene COM-Schnittstellen ermitteln
Verfasst: 15.11.2009 23:14
von Kiffi
hier die WMI-Variante:
Code: Alles auswählen
; dieses Beispiel benötigt COMatePLUS von srod:
; http://www.purecoder.net/comate.htm
IncludePath #PB_Compiler_Home + "srod\COMatePLUS\" ; Pfad anpassen!
XIncludeFile "COMatePLUS.pbi"
Define objWMIService.COMateObject
Define colItems.COMateEnumObject
Define objItem.COMateObject
Define strComputer.s
strComputer = "."
objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
If objWMIService
colItems = objWMIService\CreateEnumeration("ExecQuery('Select * FROM Win32_SerialPort')")
If colItems
objItem = colItems\GetNextObject()
While objItem
Debug objItem\GetStringProperty("DeviceID")
objItem\Release()
objItem = colItems\GetNextObject()
Wend
colItems\Release()
EndIf
objWMIService\Release()
EndIf
Grüße ... Kiffi
Re: Vorhandene COM-Schnittstellen ermitteln
Verfasst: 16.11.2009 21:10
von Hein
@Crawler
Diese Methode habe ich schon probiert aber genau diese wollte ich eigentlich vermeiden.
Sie liefert mir nur die "freien" Ports.
@Kiffi
Danke, werde ich probieren.
Muß mir noch comateplus besorgen.
Geht doch mit der Demo oder ?
@Hexor
Ja die Reg abzufragen war auch einer meiner ersten Ideen und gefällt mir am besten aber geht leider in der Demo nicht.
@All
Erstmal danke für die Anregungen
Ich überlege mir eh ob ich mir Purebasic zulege.
Re: Vorhandene COM-Schnittstellen ermitteln
Verfasst: 16.11.2009 21:25
von Kiffi
Hein hat geschrieben:Muß mir noch comateplus besorgen.
Geht doch mit der Demo oder ?
nee, mit der Demo funktioniert das nicht.
Hein hat geschrieben:Ich überlege mir eh ob ich mir Purebasic zulege.
mach das! Bis dahin bitte in Deine Signatur eintragen,
dass Du nur die Demo hast.
Grüße ... Kiffi