- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: Frage bezüglich Zeichen einlesen

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    53
    Beiträge
    2.803

    Frage bezüglich Zeichen einlesen

    Anzeige

    Praxistest und DIY Projekte
    Ahoi,
    ...ich stehe gerade ein bisschen auf dem Schlauch - ich möchte mir über den UART bestimmte Zeichenfolgen einlesen, davon aber nur einen Teil in eine Variable schreiben. Sinn soll sein, dass ich z.B. im Terminalprogramm einen Text per Befehl in eine bestimmte Zeile in mein LC-Display schreibe

    Wenn z.B. der Befehl kommt "Z1:abcd", dann soll er in die erste Zeile halt "abcd" schreiben, bei "Z2yz" dann "xyz" in die zweite Zeile...usw.

    Per "Inkey" bekomme ich zwar bisher alles in das Display geschrieben, es soll aber halt immer nur der Inhalt nach dem Doppelpunkt kommen und alles davor z.B. als Sprung dienen (à la "if Z1-Folge goto Z1-Routine -> lese alles nach Doppelpunkt -> schreibe dies ins Display")

    Jemand eine Idee ?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Da gibt es zwei Wege:
    einen allgemeinen
    Du definierst eine Syntax, z.B. "Param:value<CR>", wobei doppelpunkt das trennzeichen ist, <CR>der delimiter, die länge param und value ist variabel.
    d.h du suchst (ev. mit mid() ) nach dem Doppelpunkt, und kannst da den String teilen
    eine angepaßt-praktischen
    wenn param fixiert ist auf "Zn:" vergleichst du direkt damit, und durch die fixierung weißt du auch gleich, wo "value" beginen muß

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    53
    Beiträge
    2.803
    ...letzteres wäre auch mein Ansatz gewesen, nur haperts hier bei der praktischen Umsetzung.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Naja, du hast
    einen STRING und STRINGLEN
    einen string PARAM
    einen string VALUE

    also den Param rausfischen
    PARAM = left (STRING, 3)
    dann Value
    temp = STRINGLEN - 3
    VALUE = right (STRING, temp )

    vergleichen
    if param = "Z1:" then ---->

    if param = "Z2:" then ---->

    Ach ja: vorher vergleichen, ob STRINGLEN > 3 ist , sonst gibt Probleme


    Kommst du damit weiter ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    53
    Beiträge
    2.803
    so, bin wieder einigermassen aus dem Urlaub da.

    habe mich mal wieder meinem "Problem" gewidmet - PickNick hat mir sehr weitergeholfen, mache aber irgendwo noch einen Denkfehler...irgendwie funktionieren meine Sprünge nicht - jemand eine idee ?

    ...gewollt ist, dass bei Eingabe im Terminal "z1Text der oberen Zeile" halt der Text in die richtige Zeile des Displays geschrieben wird.

    Code:
    $regfile = "m8def.dat"                                      'Controller definieren'
    $crystal = 3686400                                          'Taktfrequenz definieren'
    $baud = 19200                                               'Baudrate definieren
    Enable Interrupts
    
    
    'LCD-Anschlüsse definieren, Ansteuerungsmodus 4 Bit / Pin '
    Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
    Config Lcd = 24 * 2
    Initlcd
    Cursor Off
    Cls
    
    
    
    
    Dim I As String * 24
    Dim T As String * 22
    Dim B As String * 2
    
    
    Do
       Input , I                                                'max 24 zeichen einlesen
       B = Left(i , 2)                                          'ersten beiden zeichen des String in Variable B schreiben
       T = Mid(i , 3 , 22)                                      'ab drittem zeichen alles in Variable T schreiben
       If B = "Z2" Then Goto Zeile1                             'wenn ersten beiden zeichen = z1 oder z2, dann springe
       If B = "Z1" Then Goto Zeile2
    
       Print B                                                  'testweise ausgabe der ersten beiden zeichen
       Print T                                                  'testweise ausgabe der folgenden zeichen
    Loop
    
    
    Zeile1:
    Upperline
    Lcd "                       "                               'beschreibe obere Zeile mit Leerzeichen zum Löschen
    Lcd T                                                       'gebe alles ab drittem zeichen aus
    
    
    Zeile2:
    Lowerline
    lcd "                       "
    Lcd T
    
    End

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    du solltest "I" nach dem auslesen löschen.
    I=""
    Abgesehen davon springst du zwar nach Zeile 1, danach aber nicht mehr zurück. Das heißt "Zeile2" wir immer auch noch ausgeführt.
    Du schreibst dann die eine Zeile des Displays jeweils voll und hängst da deinen Text dran.
    Der wird dann allerdings in den Zeichenbuffer geschrieben und nicht da, wo er hin soll.
    Also noch ein Locate Befehl dazu um an die richtige Stelle zu schreiben



    Code:
    $regfile = "m8def.dat"                                      'Controller definieren'
    $crystal = 3686400                                          'Taktfrequenz definieren'
    $baud = 19200                                               'Baudrate definieren
    Enable Interrupts
    
    
    'LCD-Anschlüsse definieren, Ansteuerungsmodus 4 Bit / Pin '
    Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
    Config Lcd = 24 * 2
    Initlcd
    Cursor Off
    Cls
    
    
    
    
    Dim I As String * 24
    Dim T As String * 22
    Dim B As String * 2
    
    
    Do
       Input , I                                                'max 24 zeichen einlesen
       B = Left(i , 2)                                          'ersten beiden zeichen des String in Variable B schreiben
       T = Mid(i , 3 , 22)                                      'ab drittem zeichen alles in Variable T schreiben
       If B = "Z2" Then : Gosub Zeile1 : End If                 'wenn ersten beiden zeichen = z1 oder z2, dann springe
       If B = "Z1" Then : Gosub Zeile2 : End If
    
       Print B                                                  'testweise ausgabe der ersten beiden zeichen
       Print T
       I = ""                                                   'testweise ausgabe der folgenden zeichen
    Loop
    
    End
    
    
    Zeile1:
       Upperline
       Lcd "                       "                            'beschreibe obere Zeile mit Leerzeichen zum Löschen
       Locate 1 , 1
       Lcd T                                                    'gebe alles ab drittem zeichen aus
    Return
    
    Zeile2:
       Lowerline
       Lcd "                       "
       Locate 2 , 1
       Lcd T
    Return

    Hab's aber nicht getestet....


    Gruß
    Christopher

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    53
    Beiträge
    2.803
    Ssssssstrikeeee !!!

    Es läuft nun exakt wie gewünscht - Zwei Zeilen können per RS232 beschrieben werden, drei LED`s per Befehl ein- oder ausgeschaltet werden.

    "z1=Der erste Test"
    ...schreibt den Text in die erste Zeile

    "z2=Dies in die zweite Zeile"
    ...in die zweite

    "l1=1"
    ...schaltet LED1 ein





    Code:
    $regfile = "m8def.dat"                                      'Controller definieren'
    $crystal = 3686400                                          'Taktfrequenz definieren'
    $baud = 19200                                               'Baudrate definieren
    Enable Interrupts
    
    
    'LCD-Anschlüsse definieren, Ansteuerungsmodus 4 Bit / Pin '
    Config Lcdpin = Pin , E = Portb.5 , Rs = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
    Config Lcd = 24 * 2
    Initlcd
    Cursor Off
    Cls
    
    
    Dim I As String * 27
    Dim T As String * 24
    Dim B As String * 3
    Dim O As String * 1
    
    Config Portd = Output
    
    Main:
    Do
       Input , I                                                'max 27 zeichen einlesen
       B = Left(i , 3)                                          'ersten drei zeichen des String in Variable B schreiben
       T = Mid(i , 4 , 24)                                      'ab drittem zeichen alles in Variable T schreiben
       O = Mid(i , 4 , 1)                                       'Abfrage ob viertes Zeichen eine  1 oder 0 für LED`s
       If B = "z1=" Then Goto Zeile1                            'wenn ersten drei zeichen z1=,z2= oder l1=..., dann springe
       If B = "z2=" Then Goto Zeile2
       If B = "l1=" Then Goto Led1
       If B = "l2=" Then Goto Led2
       If B = "l3=" Then Goto Led3
       I = ""
    Loop
    
    
    
    Zeile1:
       Upperline
       Lcd "                        "                           'beschreibe obere Zeile mit Leerzeichen zum Löschen
       Locate 1 , 1                                             'springe wieder zurück zur ersten Position
       Lcd T                                                    'gebe alles ab drittem zeichen der Eingabe aus
    Goto Main
    
    Zeile2:
       Lowerline
       Lcd "                        "
       Locate 2 , 1
       Lcd T
    Goto Main
    
    
    
    Led1:
       If O = "1" Then Portd.2 = 1                              'bei l1=1 schaltet sich LED1 ein
       If O = "0" Then Portd.2 = 0                              'bei l1=0 schaltet sich LED1 aus
    Goto Main
    
    Led2:
       If O = "1" Then Portd.3 = 1
       If O = "0" Then Portd.3 = 0
    Goto Main
    
    Led3:
       If O = "1" Then Portd.4 = 1
       If O = "0" Then Portd.4 = 0
    Goto Main
    
    End
    Danke nochmal für die Hilfe !!!

Berechtigungen

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

12V Akku bauen