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