Gelöst:bascom Print wird von PureBasic Select Case ignoriert

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Sven9
Beiträge: 5
Registriert: 23.11.2012 10:43

Gelöst:bascom Print wird von PureBasic Select Case ignoriert

Beitrag von Sven9 »

Hallo Leute,

Bin gerade am verzweifeln, meine Hardware mit einem AVR als Controller soll zwei Relais schalten.
Das Programm für den AVR habe ich mit Bascom erstellt.
Das schalten der Relais über die serielle Schnittstelle war kein Problem, aber ich wollte das Pure Basic Programm zum Steuern des AVR noch verbessern.
Und zwar soll die Umschaltung der Relais über ein Status kommando, vom AVR zum Pure Basic Programm, erfolgen.

Im Bascom Programm sende ich per "Print" befehl den Status der Relais z.b. R1_Ein

Im Pure Basic Programm nehme ich den Befehl mit "ReadSerialPortData" entgegen und übergebe ihn an eine Select Case
Uns hier liegt mein Problem die Select Case ignoriert den mit "ReadSerialPortData" empfangen String und führt die Case Anweisung nicht aus.

Zum testen habe ich ein zweites Programm in Pure Basic geschrieben welches die Hardware simuliert und genau die gleichen befehle über einen
virtuellen Com-Port zurück gibt.
Mit der Simulation funktioniert alles, mit dem Debuger kann ich keine Unterschiede bei den empfangen Daten feststellen.

ich hoffe ihr könnt mir weiter helfen

Programm zum Steuern

Code: Alles auswählen

If OpenWindow(0,0,0,1224,324,"Relais-Schalten-v1.0",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  
  MessageRequester("Fehler","Fehler konnte kein Fenster oeffnen",0)

EndIf

;Gadget
ButtonGadget(2,200,25,80,30,"R1_Ein/Aus") 
ButtonGadget(3,200,75,80,30,"R2_Ein/Aus")
ButtonGadget(4,22,25,120,30,"Relais 1") 
ButtonGadget(5,22,75,120,30,"Relais 2")
EditorGadget(6,22, 120, 125, 30, #PB_String_ReadOnly) ;empfangen
;TextGadget(7,250,150,200,20,"Status")

;Konstanten Deklarieren
#R1_Ein = "3"
#R1_Aus = "4"
#R2_Ein = "1"
#R2_Aus = "2"
#Connect = "7"
;Variablen Deklarieren
EventID.l
Status_Relais_1.b
Status_Relais_2.b
Eingang.s
Quit.b
Serial_in.s
Serial_out.s
Data_in.i
Meldung.s
Connect.s
Verbunden.b
;{;Suche verfügbare COM-Port's und Auto-Connect mit Zielschaltung
;Variabeln
Port.s
port_nr.i
res.i

Serial_in = ""
Verbunden = 0

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                                             ;Überprüft, ob die geöffnete serielle Schnittstelle gültige und korrekt initialisierte ist
       WriteSerialPortString(res,#Connect)                              ;Sende Anfrage zum verbinden an Zielschaltung
       Delay(800)

        Data_in = AvailableSerialPortInput(res)                         ;überprüfen, ob Daten verfügbar 
        If data_in > 0                                                  ;wenn Daten verfügbar
          Serial_in = Space(data_in)                                                                      
          ReadSerialPortData(res, @serial_in,data_in)                   ;Lese Daten von serielle Schnittstelle
          AddGadgetItem(6,0,"AVR-Meldet " +serial_in)
          ;Debug "1-Serial_in " +Serial_in
          ;If serial_in = "Connect"
            ;Debug "2-Serial_in " +Serial_in
             Verbunden = 1
             serial_in = "       "
             Break
          ;EndIf
        EndIf      
        serial_in = "       "
        Debug port_nr
      



CloseSerialPort(res)
EndIf
Next

If Verbunden = 1
  ;port_nr = res
  ;Debug "port_nr = " +Str(port_nr)
  Debug "Port " +Port 
   MessageRequester("Verbunden", "mit Steckdosenleiste")

Else
MessageRequester("Fehler", "keine Verbindung mit Steckdosenleiste")  
DisableGadget(4,1)
DisableGadget(5,1)
EndIf 
;}
;{;Hauptprogramm
HideGadget(2, 0)                                  ; wir müssen ImageGadget2 "Signal-Rot.bmp" einmal aktivieren und wieder 
HideGadget(2, 1)                                  ; deativieren da es sonst beim ersten aufruf in Zeile 181 Nicht angezeigt wird
HideGadget(3, 0)                                  ; wir müssen ImageGadget3 "Signal-Rot.bmp" einmal aktivieren und wieder 
HideGadget(3, 1)                                  ; deaktivieren da es sonst beim ersten aufruf in Zeile 189 Nicht angezeigt wird



Repeat                                           ; In dieser Schleife werden die Aktionen durchgefuehrt.
  EventID = WaitWindowEvent()                    ; Die Variable EventID wird der Funktion WaitWindowEvent (WarteAufAktion) zugewiesen.
  
 If Verbunden = 1  
  Data_in= AvailableSerialPortInput(res) 
  If data_in > 0        
    Serial_in = Space(data_in)                                                                      
    ReadSerialPortData(res, @serial_in,data_in)                
    Debug "3-Serial_in = " +Serial_in
    Gosub Status
  EndIf      
EndIf  

If EventID = #PB_Event_Gadget
     
Select EventGadget()

Case 4 : 

    If Status_Relais_1 = 0  
      serial_out = #R1_Ein
      ;Status_Relais_1 = 1 
      
    Else   
      If Status_relais_1 = 1
      serial_out = #R1_Aus
      ;Status_Relais_1 = 0   
      
      EndIf   
    EndIf 
Gosub Befehl_Senden  
  
Case 5 : 
                                                          ; wenn ja --> sonst Fehlermeldung "Bitte Com-Port auswählen"
    If Status_Relais_2 = 0                                ; Prüfung: Ist Relais 2 Aus, wenn ja
      serial_out = #R2_Ein                                ; vorbereitung zum Einschalten von Relais 2
      ;Status_Relais_2 = 1                                 ; Merke: Relais 2 ist jetzt Eingeschalten | Toggle-Variable nötig um "umschalten" zu ermöhlichen
                                          ; Blende Bild ein "Signal-rot.bmp"
    Else                                                  ; Ist Relais 2 bereits Ein dann 
      serial_out = #R2_Aus                                ; vorbereitung zum Ausschalten von Relais 2                     
      ;Status_Relais_2 = 0                                 ; Merke: Relais 2 ist jetzt Ausgeschalten | Toggle-Variable nötig um "umschalten" zu ermöhlichen
                                          ; Blende Bild aus "Signal-rot.bmp"
    EndIf  
Gosub Befehl_Senden
  
EndSelect           
EndIf


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 an Ziehlschaltung Senden
Befehl_Senden:
ClearGadgetItems(6)



WriteSerialPortString(res,serial_out)     ; Sende Befehle an Zielschaltung (Relais 1/2 EIN/AUS)
Delay(100)
Debug "Serial_Out =" +serial_out
AddGadgetItem(6,0,Eingang)

Return

Status:
Select Serial_in
  Case "Connect":
    
  Case "R1_Ein":
    Status_Relais_1 = 1
    HideGadget(2, 0)
    
  Case "R1_Aus":
    Status_Relais_1 = 0
    HideGadget(2, 1)
    
  Case "R2_Ein":
    Status_Relais_2 = 1
    HideGadget(3, 0)
    
  Case "R2_Aus":
    Status_Relais_2 = 0
    HideGadget(3, 1)
    
  Case "Manuel":
    
  Case "Auto":
    
EndSelect
Debug "GoSub Status"
Debug "Status_Relais_1" +Str(Status_Relais_1)
Debug "Status_Relais_2" +Str(Status_Relais_2)
Serial_in =""
Return

zum simulieren der Hardware

Code: Alles auswählen

;{;Enum COM-Ports

Enumeration 
  #COM_Err
  #COM_1
  #COM_2
  #COM_3
EndEnumeration
;}
Status.s
Puffer.s
;Simuliert die Hardware
byte = 0
Status = ""
Puffer = ""
If OpenSerialPort(#COM_3, "COM"+Str(#COM_3), 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
   MessageRequester("Information", "SerialPort opened with success")
   While AvailableSerialPortInput(#com_3)=0
     If ReadSerialPortData(#com_3,@Byte,4)
       
       Debug byte
       Puffer = Chr(Byte)
       Debug "Puffer " +Puffer
       Select Puffer
        Case "7":   
           Status = "Connect"
        Case "3":
           Status = "R1_Ein"
        Case "4":   
           Status = "R1_Aus"
        Case "1":
           Status = "R2_Ein"
        Case "2":
           Status = "R2_Aus"
      EndSelect
       byte = 0
       puffer =""
      Gosub Ausgabe 
      EndIf
   Wend
Else
   MessageRequester("Error", "Can't open the serial port: COM3")
 EndIf
 
 Ausgabe:
 WriteSerialPortString(#com_3, Status)
 Debug "Status = " +Status
 Return
Zuletzt geändert von Sven9 am 08.12.2012 17:58, insgesamt 1-mal geändert.
PureBasic 4.60 Demo
Sven9
Beiträge: 5
Registriert: 23.11.2012 10:43

Re: bascom Print wird von Pure Basic Select Case ignoriert

Beitrag von Sven9 »

Hallo Leute,
Habe das Problem gelöst mein Programm tut jetzt was es soll.
wenn man mit Bascom z.B.

Code: Alles auswählen

Print "Hallo"
an die Serielle schickt wir automatisch das CR und LF mit gesentet
ich vermute das beim nächsten senden LF noch im Puffer steht und in den String übernommen wird was dann meine
Select Auswertung stört.

Schreibt man ein semicolon (;) hinter den zusenden String

Code: Alles auswählen

Print "Hallo";
wird CR und LF nicht mitgesendet.

Gruß, Sven9
PureBasic 4.60 Demo
Antworten