PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage bezüglich Zeichen einlesen



Andree-HB
06.07.2005, 07: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 ?

PicNick
06.07.2005, 07:35
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, 07:52
...letzteres wäre auch mein Ansatz gewesen, nur haperts hier bei der praktischen Umsetzung.

PicNick
06.07.2005, 08:02
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, 20: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

chr-mt
10.08.2005, 22:13
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, 14: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 !!!