Moin
Hab mir gerade mal deinen Code angesehen.
Du verwendest ganze Wörter als Kommandos.
In diesem Falle also "Start" und "Graph"
Das Programm soll die Abfrageroutine immerwieder durchlaufen bis ein Kommando kommt und dann in eines der beiden Unterprogramme ausführen.
Ansonsten existiert noch die Interruptroutine die die Zeichen empfängt und den Zähler raufsetzt.
Die Unterprogramme sind ok und die Onrxd auch obwohl man da vieleicht für die Zeit der Verarbeitung den Interrupt ausschalten könnte damit ein weiteres Zeichen nicht dazwischen funkt.
Nur die Hauptschleife ist so nicht ok.
Zum einen fällt mir auf das du überhaupt kein Hauptschleife hast.
Ich nehme mal an das ganze ist nur nen auszug also hab ich mal nen Do-Loop draus gemacht.
Nebenbei vermissse ich nen "END" am Ende das Programms.
Hab auch das mal reingesetzt.
Da deine Hauptschleife "vorerst" nur aus einer IF-Then und Case Kombi besteht fällt mir auf das du nur auf "If N < 6 Then" prüfst und im Falle von N>=6 garnicht reagierst.
Ist N also schon 5 Zeichen lang aber kein gültiges Kommando enthalten dann läuft das Programm ins Nirvana da zum einen der Zähler erst beim Überlauf wieder zurückkommt und zum anderen würde eine Stringanweisung auf das >=6. Zeichen auch nix bringen da S_cmd und B_cmd nur für 5 Zeichen definiert sind.
Dazu gehst du mit Goto in die Subs wovon se mit Return nur selten zurückkommen.
Ich habs mal auf Gosub geändert.
Dann fällt mir auf das "N=0" und S_cmd = " " hinter der Caseanweisung stehen und jedesmal ausgeführt wird solange N nur kleiner 6 ist.
Also da muß umgebaut werden damit auch mal ein Befehl ankommt.
Ich hab N=0 und S_cmd = " " in die Caseanweisungen gelegt da sie ja nur ausgeführt werden wenn das Kommando vorhanden ist.
Ebenfalls einmal hinter einem "Else" wenn "N<6" nicht mehr gegeben ist.
Das passiert wenn kein gültiges Kommando über die Serielle gekommen ist.(Vertippert,Störung usw.)
Wenn du übrigens Automatische Kommandos vom Rechner an den Controller geben willst dann würde ich einen Rückkanal einrichten denn sollte die Komunikation mal aus dem Tritt geraten dann hast du keine chance das im Betrieb wieder zu korrigieren.
Mit einem Rückkanal kann der controller zumindest mitteilen das die Komunikation ok oder auch nicht ok ist damit das Programm im Rechner entsprechend reagieren kann.
Obendrein können die Komandos natürlich auch kürzer ausfallen wenn nix weiter übertragen werden soll.
Dem controller ist das egal.
So,hab die Änderungen gemacht und hoffe das ich jetzt keinen Denkfehler bei der Verschachtelten IF-Then gemacht habe.
Überprüfen kann ich es jetzt nicht also keinerlei Garantie dafür.
Code:
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 19200
Dim S_cmd As String * 5 'für RS232
Dim B_cmd(5) As Byte At S_cmd Overlay 'Liegt auf der Adresse des Strings s! RS232
Dim N As Byte 'zähl variable RS232
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 8
Cursor Off
Do
If N < 6 Then
Select Case S_cmd
Case "Start"
Gosub Lcd1
N = 0
S_cmd = " "
Case "Graph"
Gosub Graph1
N = 0
S_cmd = " "
End Select
Else
N = 0
S_cmd = " "
End If
Loop
Lcd1:
Locate 1 , 1 : Lcd "Wilkommen zu Bertls GLCD"
Locate 2 , 1 : Lcd "Bascom T6963c support"
Locate 3 , 1 : Lcd "123456789012345678901234567890"
Locate 16 , 1 : Lcd "Unterste Zeile "
Wait 4
Cls
Return
Graph1:
Line(64 , 64) -(130 , 64) , 1
Line(130 , 64) -(130 , 100) , 1
Line(130 , 100) -(64 , 100) , 1
Line(64 , 100) -(64 , 64) , 1
Wait 4
Cls
Return
Onrxd:
Incr N
B_cmd(n) = Udr
Return
End
Lesezeichen