Gadgets - verfügbare Anschlüsse anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Lass dir mal die Rückgabewerte debuggen.
Vielleicht gibt ein "echter ComPort" der angewählt werden kann ja "-1" zurück, und "kaputte", oder "mögliche" "+1"...

Code: Alles auswählen

For i=1 To 100
  checkVal = OpenComPort(0,"Com"+Str(i)+":")
  Debug checkVal
  If checkVal
    AddGadgetItem(#Combo_0,-1,"Com"+Str(i)+":")
    CloseFile(0)   
  EndIf
Next i 
Oder den Last Errorcode abfragen? Oder vielleicht Purefans OnError-Lib nutzen? Da der Befehl undokumentiert ist, müsste man echt mal "ausprobieren"...

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Doris
Beiträge: 5
Registriert: 20.10.2006 14:23
Wohnort: München

Beitrag von Doris »

Hallo,

ich glaub, ich habe einen Geist im PC. Das Programm läuft durch und der COM gibt wohl wirre Werte zurück.
Laut Gerätemanager habe ich COM1 und COM 4 zur Verfügung, sonst nix. Die Werte sehen aber so aus, dass COM1, COM2 und alle ab COM10 den Wert 0 zurückgeben. Bei Aufruf von COM3 bis COM9 kommt der Wert 1932.

Ich denke, ich werde PB mal auf dem zweiten PC installieren und das gleiche Programm dort ausprobieren um zu sehen, was da zurückkommt.

Danke erstmal für die Hilfe.

Gruss - Doris
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

OpenComPort() (übrigens laut kundiger Aussage identisch mit Openfile())
versucht ja auch nur den Port zu öffnen.

Wenn der nicht zu öffnen ist weil schon belegt, dann reicht OpenComPort() bzw. OpenFile() nicht aus.

Ich hab meine Code mal angepasst und READFILE() statt OpenFile() bzw. OpenComport() genommen.

Das könnte eventuell funktionieren.

ReadFile() hilft anscheindend auch nicht

Wenn der Port belegt ist gibt es so 0 i.e. nicht verfügbar zurück

zur weiteren Behandlung ist es mit PB eh mühsam

Da empfehle ich mal die MVCOMLib vom marc Vitry auf Purearea.net


Die vorhandenen CommPorts müsste man unter Windoof per APi
aufzählen lassen können. Ich schau mal.
Zuletzt geändert von bobobo am 26.10.2006 16:53, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

HA !! ..englishes Forum

http://www.purebasic.fr/english/viewtop ... t=comports


und das geht sogar

etwas netter so

Code: Alles auswählen


#DIGCF_DEFAULT                     =   1 
#DIGCF_PRESENT                     =   2 
#DIGCF_ALLCLASSES                  =   4 
#DIGCF_PROFILE                     =   8 
#DIGCF_DEVICEINTERFACE             =  16 
#SPDRP_DEVICEDESC                  =   0 
#MAX_CLASS_NAME_LEN                = 128 
#DIREG_DEV                         =   1 
#DIREG_DRV                         =   2 
#DICS_FLAG_GLOBAL                  =   1 
#DICS_FLAG_CONFIGSPECIFIC          =   2 
#SPDRP_DEVICEDESC                  =   0 ; ECP-Druckeranschluss 
#SPDRP_HARDWAREID                  =   1 ; ACPI\PNP0401 
#SPDRP_COMPATIBLEIDS               =   2 ; (err13) 
#SPDRP_SERVICE                     =   4 ; Parport 
#SPDRP_CLASS                       =   7 ; Ports 
#SPDRP_CLASSGUID                   =   8 ; {4D36E978-E325-11CE-BFC1-08002BE10318} 
#SPDRP_DRIVER                      =   9 ; {4D36E978-E325-11CE-BFC1-08002BE10318}\0000 
#SPDRP_CONFIGFLAGS                 =  10 ; 127 (Zahl=Long) 
#SPDRP_MFG                         =  11 ; (Standardanschlusstypen) 
#SPDRP_FRIENDLYNAME                =  12 ; ECP-Druckeranschluss (LPT1) 
#SPDRP_LOCATION_INFORMATION        =  13 ; (err13) 
#SPDRP_PHYSICAL_DEVICE_OBJECT_NAME =  14 ; \Device\0000005c 
#SPDRP_CAPABILITIES                =  15 ; 48 (Zahl=Long) 
#SPDRP_UI_NUMBER                   =  16 ; (err13) 
#SPDRP_UPPERFILTERS                =  17 ; (err13) 
#SPDRP_LOWERFILTERS                =  18 
#SPDRP_BUSTYPEGUID                 =  19 
#SPDRP_LEGACYBUSTYPE               =  20 
#SPDRP_BUSNUMBER                   =  21 
#SPDRP_ENUMERATOR_NAME             =  22 ; ACPI 
#SPDRP_SECURITY                    =  23 
#SPDRP_SECURITY_SDS                =  24 
#SPDRP_DEVTYPE                     =  25 
#SPDRP_EXCLUSIVE                   =  26 
#SPDRP_CHARACTERISTICS             =  27 
#SPDRP_ADDRESS                     =  28 
#SPDRP_UI_NUMBER_DESC_FORMAT       =  30 

Global NewList comports.s()

Structure SP_DEVICE_INTERFACE_DATA 
  cbSize.l 
  InterfaceClassGuid.GUID 
  Flags.l 
  Reserved.l 
EndStructure 

Structure SP_DEVINFO_DATA 
  cbSize.l 
  ClassGuid.GUID 
  DevInst.l 
  Reserved.l 
EndStructure 

Structure ComArrayStructure 
  ComPort.s 
EndStructure 

Procedure.s EnumComPorts() 
  zClassName.s="Ports" 
  PortName.s="" 
  DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA 
  DeviceInfoData.SP_DEVINFO_DATA 
  hDeviceInfoSet.l=0 
  Size.l=0 
  hKeyDevice.l=0 
  DevCount.l=0 
  value.l=0 
  value=SetupDiClassGuidsFromName_(zClassName,0,0,@Size) ; only ask for size of array 
  If value=0 
    err=GetLastError_() 
    If err=#ERROR_INSUFFICIENT_BUFFER ; we will get this error and know the arraysize now 
      out.s+ "The data area passed to a system call is too small."  +#CRLF$
      out.s+ "RequiredSize : "+Str(Size)  +#CRLF$
    EndIf 
    If Size>0 
      Dim GuidArray.GUID(Size) 
      value=SetupDiClassGuidsFromName_(zClassName,@GuidArray(1),SizeOf(GUID)*Size,@Size) 
      If value>0 
        hDeviceInfoSet=SetupDiGetClassDevs_(@GuidArray(1),0,0,#DIGCF_PRESENT) 
        err=GetLastError_() 
        If err=#ERROR_IO_PENDING Or err=0 
          out.s+ "Overlapped I/O operation is in progress."  +#CRLF$
          If hDeviceInfoSet<>#INVALID_HANDLE_VALUE 
            DeviceInfoData\cbSize=SizeOf(DeviceInfoData) 
            DeviceInterfaceData\cbSize=SizeOf(DeviceInterfaceData) 
            NewList ComArray.ComArrayStructure() 
            Repeat 
              value=SetupDiEnumDeviceInfo_(hDeviceInfoSet,DevCount,@DeviceInfoData) 
              If value=0 
                err=GetLastError_() 
                If err=#ERROR_NO_MORE_ITEMS 
                  out.s+"No more Data is available." +#CRLF$
                EndIf 
                Break 
              EndIf 
              hKeyDevice=SetupDiOpenDevRegKey_(hDeviceInfoSet,@DeviceInfoData,#DICS_FLAG_GLOBAL,@HwProfile,#DIREG_DEV,#KEY_QUERY_VALUE) 
              PortName=Space(128) 
              lpValueName.s="portname" 
              lpcbData.l=Len(lpValueName) 
              RegQueryValueEx_(hKeyDevice,@lpValueName,0,0,@PortName,@lpcbData) 
              If Left(PortName,3)="COM" 
                AddElement(ComArray()) 
                ComArray()\ComPort=PortName 
                out.s+ PortName  +#CRLF$
              EndIf 
              RegCloseKey_(hKeyDevice) 
              DevCount+1 
            ForEver 
            If hDeviceInfoSet 
              SetupDiDestroyDeviceInfoList_(hDeviceInfoSet) 
              hDeviceInfoSet=0 
            EndIf 
            FirstElement(ComArray()) 
            Repeat 
              out.s+ "Found : "+ComArray()\ComPort  +#CRLF$
              out1.s+ComArray()\ComPort+":"
              AddElement(comports())
              Comports()=ComArray()\ComPort+":"
              ;Debug Comports()
            Until NextElement(ComArray())=0 
          EndIf 
        EndIf 
      EndIf 
    EndIf 
  EndIf 
  ProcedureReturn out1.s
EndProcedure 

EnumComPorts()

Enumeration
  #Window_0
  #Combo_0
  #Button_0
  #Button_1
  #Button_2
  #Text_0
EndEnumeration

If OpenWindow(#Window_0, 216, 0, 380, 159, "Portauswahl",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(#Window_0))
    ComboBoxGadget(#Combo_0, 10, 30, 130, 200, #PB_ComboBox_UpperCase)
    ButtonGadget(#Button_0, 240, 30, 90, 20, "ok")
    ButtonGadget(#Button_1, 240, 60, 90, 20, "ko")
    ButtonGadget(#Button_2, 240, 90, 90, 20, "¿?")
    TextGadget(#Text_0, 10, 10, 190, 20, "Wähle den Port")
  EndIf
EndIf

ForEach Comports()
    AddGadgetItem(#Combo_0,-1,Comports())
Next     
  

SetGadgetState(#Combo_0,0)
Repeat
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()
  If Event = #PB_Event_Gadget
    If GadgetID = #Combo_0
    ElseIf GadgetID = #Button_0
      SetGadgetText(#TExt_0,"Na gut ..meinetwegen "+GetGadgetText(#Combo_0))
      DisableGadget(#Button_0,1)
      Delay(1000)
      DisableGadget(#Button_0,0)
      SetGadgetText(#TExt_0,"Wähle den Port")
    ElseIf GadgetID = #Button_1
      End
    ElseIf GadgetID = #Button_2
      MessageRequester("AHA","Das Zeichen ¿ erhälst Du, wenn Du ALT drückst und dann 0191 eingibst",#MB_ICONEXCLAMATION)
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow
End
ist doch gar nicht so schwer :mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Oder so ?

Code: Alles auswählen

Enumeration
  #Window_0
  #Combo_0
  #Button_0
  #Button_1
  #Button_2
  #Text_0
EndEnumeration

Procedure GetCOMPorts()
Protected I.l,ComName$,ComHandle.l
For I = 1 To 50
ComName$ = "\\.\COM"+Str(I)
ComHandle = CreateFile_(Comname$,#GENERIC_READ|#GENERIC_WRITE,0,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL|#FILE_FLAG_OVERLAPPED,0)
If ComHandle <> #INVALID_HANDLE_VALUE
    AddGadgetItem(#Combo_0,-1,"Com"+Str(i)+":")
    CloseHandle_(ComHandle)
EndIf
Next
EndProcedure

If OpenWindow(#Window_0, 216, 0, 380, 159, "Portauswahl",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )

  If CreateGadgetList(WindowID(#Window_0))
    ComboBoxGadget(#Combo_0, 10, 30, 130, 200, #PB_ComboBox_UpperCase)
    ButtonGadget(#Button_0, 240, 30, 90, 20, "ok")
    ButtonGadget(#Button_1, 240, 60, 90, 20, "ko")
    ButtonGadget(#Button_2, 240, 90, 90, 20, "¿?")
    TextGadget(#Text_0, 10, 10, 190, 20, "Wähle den Port")
  EndIf

EndIf

GetCOMPorts()

SetGadgetState(#Combo_0,0)

Repeat
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()

  If Event = #PB_Event_Gadget

    If GadgetID = #Combo_0

    ElseIf GadgetID = #Button_0
      SetGadgetText(#TExt_0,"Na gut ..meinetwegen "+GetGadgetText(#Combo_0))
      DisableGadget(#Button_0,1)
      Delay(1000)
      DisableGadget(#Button_0,0)
      SetGadgetText(#TExt_0,"Wähle den Port")

    ElseIf GadgetID = #Button_1
      End

    ElseIf GadgetID = #Button_2
      MessageRequester("AHA","Das Zeichen ¿ erhälst Du, wenn Du ALT drückst und dann 0191 eingibst",#MB_ICONEXCLAMATION)
    EndIf

  EndIf

Until Event = #PB_Event_CloseWindow

End
Gruss Andreas
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

@Andreas

da kannst Du auch gleich die Openfile() Geschichten von PB nehmen ..
das funktiert nicht (!!) bei bereits geöffneten Ports
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Vielleicht mal mit Hilfe der droopy-lib die Registry auslesen,
da die Hardware ja auch bei Aktivierung angemeldet wurde.

Code: Alles auswählen

Index=0 
While RegListSubValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports",Index,".")<>"" 
   value.s=RegListSubValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports",Index,".")
   key.s=RegGetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports",value,".")
   Debug value+"  "+key
   Index+1
Wend
Die Ausgabe bei mir ist dann im Debugger folgende:
Debuger hat geschrieben:COM1: 19200,n,8,1
COM2: 9600,n,8,1
COM3: 9600,n,8,1
COM4: 9600,n,8,1
FILE:
LPT1:
LPT2:
LPT3:
Gruß ...Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Falls jemand im englischen Forum fragen möchte, warum das
OpenCom... von Fred nicht in die Hilfe eingefügt wurde, was schon in den
älteren PB-Versionen auch schon gab, aber nie in die Hilfe kam,
siehe folgenden Link:

http://www.purebasic.fr/english/viewtop ... ht=opencom

Gruss Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten