Mein erstes PureBasic Programm

Anfängerfragen zum Programmieren mit PureBasic.
Sven9
Beiträge: 5
Registriert: 23.11.2012 10:43

Mein erstes PureBasic Programm

Beitrag von Sven9 »

Hallo,
Ich bin neu hier und nicht nur ein PureBasic sonder generell ein Programmier- Anfänger.
Das Programm habe ich mit Hilfe von Tutorials und viel Lesen hier im Forum zusammen geschustert,
jetzt komme ich allerdings nicht weiter und hoffe auf eure Hilfe.

Das Programm soll einen Mikrocontroller der über die Serielle Schnittelle am PC angeschlossen ist steuern.
Erstmal soll ein Relais umgeschaltet werden.
Die Zielschaltung Reagiert momentan auf folgende über die Serielle empfangenen werte
49 = Schaltet Relais 1 Ein
50 = Schaltet Relais 1 Aus
51 = Schaltet Relais 2 Ein
52 = Schaltet Relais 2 Aus

Problem:
Nach einem Klick auf den Button "Relais Umschalten" wird im Hauptprogramm die Select Case Anweisung min. drei mal ausgeführt,
sie sollte aber nur ein mal ausgeführt werden.
Ich verstehe einfach nicht wieso kann mir das einer erklären und helfen den Fehler zu beseitigen?

Grüße, Sven9

Code: Alles auswählen

If OpenWindow(0,0,0,1224,324,"Com Port Auswahl Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  
  MessageRequester("Fehler","Fehler konnte kein Fenster oeffnen",0)

EndIf

;Gadget
ButtonGadget(1,22,25,120,30,"Relais Umschalten")

EditorGadget(3,250,170,200,100, #PB_String_ReadOnly) 
EditorGadget(4,8,170,200,100, #PB_String_ReadOnly) 
TextGadget(5,250,150,200,20,"Eingang")
TextGadget(6,8,150,200,20,"Ausgang")
ComboBoxGadget(11, 24, 120, 118, 20) 

;{;Konstanten Deklarieren
#Ein = 49
#Aus = 50
;}
;Variablen Deklarieren

EventID.l
status_relais_1.b
status_relais_2.b
relais_1.b
relais_2.b
Serial_out.s
;{;Suche verfügbare COM-Port's 
;Variabeln
Port.s
port_nr.i
res.i


AddGadgetItem(11, -1,"COM-Port Wählen ")
For Port_nr =1 To 16

    Port = "COM"+Str(port_nr)
    res= OpenSerialPort(#PB_Any, Port , 9600,#PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
     
    If IsSerialPort(res)<>0     
      AddGadgetItem(11, -1,Port)
      CloseSerialPort(res)       
    EndIf     

Next


SetGadgetState(11, 0)
;}
;{;Hauptprogramm
port_nr=0
Repeat                                             ; In dieser Schleife werden die Aktionen durchgefuehrt.
  EventID = WaitWindowEvent()                    ; Die Variable EventID wird der Funktion WaitWindowEvent (WarteAufAktion) zugewiesen.
  
If EventID = #PB_Event_Gadget
  If EventGadget() = 11
     port_nr = GetGadgetState(11)
Debug port_nr
     Port = "COM"+Str(port_nr)
Debug Port
     If OpenSerialPort(port_nr, Port , 9600,#PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
     Else
        MessageRequester("Information", "Konnte Port nicht öffnen")  
     EndIf     
  EndIf
EndIf  

Select EventGadget()
  Case 1 : 
    If port_nr > 0 
      If status_relais_1 = 0
        status_relais_1 = 1
        relais_1 = 49
      Else
   
        status_relais_1 = 0
        relais_1 = 50 
      EndIf       
      serial_out=Str(relais_1)
      Gosub Befehl_Senden
 Else
      MessageRequester("Fehler", "Bitte COM-Port auswählen")  
EndIf 

EndSelect

If EventID = #PB_Event_CloseWindow                ; Wenn der Benutzer die Aktion schliessen drueckt,
Quit = 1                                       ; wird die Quit Variable aktiviert.
EndIf                                            ; Ende der Abfrage 

Until Quit = 1                                     ; Wenn die Quit Variable aktiviert ist, schliesse das Programm.
CloseSerialPort(port_nr)  
End
;} 

Befehl_Senden:
z +1
Debug"z" +Str(z)
Debug "Serial_out = " +serial_out
AddGadgetItem(4,0,serial_out)
WriteSerialPortString(port_nr, serial_out+Chr(13))
Delay(1000)
If z>=6
  ClearGadgetItems(4)
  z=0
EndIf
Return
PureBasic 4.60 Demo
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mein erstes PureBasic Programm

Beitrag von NicTheQuick »

Dein "Select EventGadget()" sollte innerhalb des "If EventID = #PB_Event_Gadget" stehen.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Mein erstes PureBasic Programm

Beitrag von CSHW89 »

Ohne es jetzt getestet zu haben: aber dein...

Code: Alles auswählen

Select EventGadget()
Case 1
...
...steht außerhalb deiner "If EventID = #PB_Event_Gadget" Abfrage. Somit kann es passieren, dass der Code mehrmals ausgeführt wird. Schiebe einfach alle EventGadget-Abfragen in ein Select:

Code: Alles auswählen

If EventID = #PB_Event_Gadget

  Select EventGadget()
    Case 1 :
      If port_nr > 0
        If status_relais_1 = 0
          status_relais_1 = 1
          relais_1 = 49
        Else
     
          status_relais_1 = 0
          relais_1 = 50
        EndIf       
        serial_out=Str(relais_1)
        Gosub Befehl_Senden
      Else
        MessageRequester("Fehler", "Bitte COM-Port auswählen") 
      EndIf
  
  Case 11
     port_nr = GetGadgetState(11)
     Debug port_nr
     Port = "COM"+Str(port_nr)
     Debug Port
     If OpenSerialPort(port_nr, Port , 9600,#PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
     Else
        MessageRequester("Information", "Konnte Port nicht öffnen") 
     EndIf     
     
  EndSelect
EndIf
lg Kevin

ps: Willkommen im Forum
Zuletzt geändert von CSHW89 am 23.11.2012 12:45, insgesamt 1-mal geändert.
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Sven9
Beiträge: 5
Registriert: 23.11.2012 10:43

Re: Mein erstes PureBasic Programm

Beitrag von Sven9 »

:bounce:
Hab mir schon Tage den Kopf zerbrochen, ich Danke euch.

So nächstes Problem
Um das ganze Optisch zu verschönern habe ich
1. Kindergrundbild
2. Signal-Bild zur anzeige Relais 1 = An
geladen

1. Das Hintergrundbild wir angezeigt jedoch wir das ComboBoxGadget erst sichtbar wenn man mit dem Mauszeiger drüber fährt
der Button ist aber sichtbar.

Code: Alles auswählen

If OpenWindow(0,0,0,1224,324,"Com Port Auswahl Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  
  MessageRequester("Fehler","Fehler konnte kein Fenster oeffnen",0)

EndIf

If LoadImage (0, "c:\Users\User\Pictures\Relais-test-2.bmp",0)   ; Hintergrundbild
     ImageGadget(7,  0, 0, 0, 0, ImageID(0))                            ; Imagegadget Standard
     DisableGadget(7,1)
   LoadImage (1, "c:\Users\User\Pictures\Signal-Rot.bmp",0)       ; Bild zu Anzeige Relais 1 = An
     ImageGadget(8,  633, 79, 59, 9, ImageID(1))                      ; Imagegadget Standard
     DisableGadget(8,1)
EndIf     
......
2. Ich habe versucht das Signal-Bild zur anzeige Relais 1 = An
ein/auszublenden. Dachte mir aber schon das es so einfach wohl nicht geht

Case 1:
If port_nr > 0
If status_relais_1 = 0
status_relais_1 = 1
relais_1 = #ein

SetGadgetState(8, 1)

Else

status_relais_1 = 0
relais_1 = #aus

SetGadgetState(8, 0)
EndIf
serial_out=Str(relais_1)
Gosub Befehl_Senden
Else
MessageRequester("Fehler", "Bitte COM-Port auswählen")
EndIf
Ergebnis = GetGadgetState(8)
Debug "ImageID = " +Str(Ergenbis) ;zur Kontrolle ob sich Status ändert
PureBasic 4.60 Demo
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Mein erstes PureBasic Programm

Beitrag von Andesdaf »

Das Ausblenden des Gadgets wäre auch mit HideGadget möglich. Ansonsten probiers
beim SetGadgetState mal mit ImageID(1).
Win11 x64 | PB 6.20
Sven9
Beiträge: 5
Registriert: 23.11.2012 10:43

Re: Mein erstes PureBasic Programm

Beitrag von Sven9 »

Hi, Danke

Mit HideGadget(8, x) läst sich das Bild ein und ausblenden mit SetGadgetState(ImageID(1)) hat es nicht funktioniert.

Allerdings muss ich
HideGadget(8, 0)
HideGadget(8, 1)
vor dem Hauptprogramm einmal aufrufen sonst wird das Bild beim ersten Aufruf in Case1: nicht angezeigt.

Beim Problem das die ComboBox erst angezeigt wird wenn ich mit dem Mauszeiger drüber fahre habe ich festgestellt
wenn ich diese Zeile auskommentiere:

Code: Alles auswählen

SetGadgetState(11, 0)  ;  macht den ersten Eintrag (beginnend bei 0) im ComboBoxGadget zum aktiven
die ComboBox beim Programmstart sichtbar ist darauf hin bin ich in der Hilfe auf den Befehl
SetActiveGadget(11)
gestoßen, leider wir damit nur der erste Eintrag sichtbar und nicht die komplette ComboBox.

Zwischendurch habe ich mit
StartDrawing(ImageOutput(0))
FrontColor(RGB(255,0,0)) ; Die Box soll eine rote Farbe bekommen (Rot, Gruen, Blau).
Box(633,79,59,9)
StopDrawing()
versucht ein gefülltes rotes Rechteck auf das Bild zu zeichnen leider ohne Erfolg wieso?

Hier ein Link zu meinem aktueller Testcode und die Bilder die ich zum Testen nutze

https://rapidshare.com/files/2309021881 ... s-Test.zip

Grüße, Sven9
PureBasic 4.60 Demo
Antworten