Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage bezüglich Zeichen einlesen
Andree-HB
06.07.2005, 08:19
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 "Z2:xyz" 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 ?
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ß
Andree-HB
06.07.2005, 08:52
...letzteres wäre auch mein Ansatz gewesen, nur haperts hier bei der praktischen Umsetzung.
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 ?
Andree-HB
10.08.2005, 21:57
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.
$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
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
$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
Andree-HB
11.08.2005, 15:44
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
$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 !!!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.