-         

Ergebnis 1 bis 8 von 8

Thema: Algorythmus

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464

    Algorythmus

    Anzeige

    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?

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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    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.
    Gruß
    Ratber

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464
    Das ich ein Start und ein Stoppzeichen einbaue hab ich schon versucht.
    Leider ein Misserfolg.
    Wie würde sowas in meinem Code aussehen?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    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.
    Gruß
    Ratber

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464
    Wäre toll
    Danke !

    MFg

    Bertl

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    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
    Gruß
    Ratber

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Yo,kein Problem
    Gruß
    Ratber

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •