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
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