Seite 1 von 1

Mein erstes PureBasic Programm

Verfasst: 23.11.2012 12:34
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

Re: Mein erstes PureBasic Programm

Verfasst: 23.11.2012 12:42
von NicTheQuick
Dein "Select EventGadget()" sollte innerhalb des "If EventID = #PB_Event_Gadget" stehen.

Re: Mein erstes PureBasic Programm

Verfasst: 23.11.2012 12:44
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

Re: Mein erstes PureBasic Programm

Verfasst: 23.11.2012 14:16
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

Re: Mein erstes PureBasic Programm

Verfasst: 24.11.2012 16:41
von Andesdaf
Das Ausblenden des Gadgets wäre auch mit HideGadget möglich. Ansonsten probiers
beim SetGadgetState mal mit ImageID(1).

Re: Mein erstes PureBasic Programm

Verfasst: 25.11.2012 15:50
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