PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Algorythmus



bertl100
11.12.2005, 21:58
Hallo Community!

Han mal wieder ein Problem.

Ich hab meinen 32 er und 8 er per RS232 direkt verbunden und tausche Daten aus , die ich in einer Caseanweisung weiterverarbeite.
Folgendes Problem:

Bisher hab ich einen String mit fester Länge gezählt und beim Empfang des letzten Bytes springt es in die Caseanweisung.
Wie ist es möglich einen String mit variabler Länge zu übertragen?


$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


If N < 6 Then

Select Case S_cmd
Case "Start" '
Goto Lcd1
Case "Graph"
Goto Graph1 ' + Chr(13);
End Select
N = 0
S_cmd = " "

End If




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

Ratber
11.12.2005, 22:36
Wie ist es möglich einen String mit variabler Länge zu übertragen?

Indem du Steuerzeichen einführst.

Such dir Zeichen raus die du für deine Daten sonst nicht nutzt.

Eines für Start,eines für Stopp und schon kannste beliebig lange Datensätze übertragen.

Natürlich kannste noch andere definieren.

bertl100
11.12.2005, 23:09
Das ich ein Start und ein Stoppzeichen einbaue hab ich schon versucht.
Leider ein Misserfolg.
Wie würde sowas in meinem Code aussehen?

Ratber
11.12.2005, 23:46
So einfach in deinen Code einbauen ist nicht
Du mußt schon die Verarbeitung der Seriellen eingaben Satzweise ordnen.

zb.:
Wenn das Startkommando kommt wird der Zähler auf 0 bzw 1 gesetzt und wenn das Stopp Kommando kommt wird erst ausgewertet und entsprechend damit verfahren.

Muß ich mir aber morgen mal genauer ansehen.

bertl100
11.12.2005, 23:47
Wäre toll
Danke !

MFg

Bertl

Ratber
12.12.2005, 10:31
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.


$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

bertl100
12.12.2005, 17:35
herzlichen Dank für deine ausführliche Beschreibung!!!!!!!!
Ich werd es erst am späten Abend genau studieren können.
Es gibt nur wenig Leute die so Hilfsbereit sind!!
Solltest du mal was brauchen wie Bascon ggg ........


MFG

Bertl

Ratber
12.12.2005, 18:15
Yo,kein Problem