Aktuelle Zeit: 25 Feb 2018 02:59:45


Frage zu Uart.inpstr()

Projects, Sources, Applications
Projekte, Quelltexte, Anwendungen
  • Autor
  • Nachricht
Offline

PJAL

  • Beiträge: 43
  • Registriert: 27 Feb 2015 20:50:24

Frage zu Uart.inpstr()

Beitrag14 Jan 2018 19:07:19

Guten Abend,
ich hänge im wahrsten Sinne des Wortes mit Uart.inpstr() fest. Vielleicht hat jemand den entscheidenden Tipp.

Ich springe vom Hauptprogramm nach Tastendruck in eine Procedure, etwa so:

Code: Alles auswählen
Procedure keymgr_demo0()

'dim .....
dim text as string
text=""

if KeyMgr.KeyLongPress( ENCODER_KEY_MASK ) then

  ' irgendwas

elseif KeyMgr.KeyShortPress( ENCODER_KEY_MASK ) then

  do

  text = Uart.inpstr(0,10)   ' Warten bis Zeichenkette verfügbar und dann lesen
  text = Trim(text)

  if Instr(text,"Z:") <> 0 then

    '... String zerlegen und Daten übernehmen
    text = ""

  elseif Instr(text,"F:") <> 0 then

    '... anderen String zerlegen und Daten übernehmen
    text = ""
  endif
  loop
endif

EndProc


Jetzt ist es so dass wenn man in der Do Loop Schleife keine weiteren Änderungen machen möchte auch nicht so einfach rauskommt da UART.inpstr() wartet. Ich würde aber gerne nach einer Zeit X (sagen wir mal 10 Sekunden) ohne dass eine Eingabe erfolgt (kein String ankommt) einfach die Do Loop Schleife verlassen was leider nur dann geht wenn ich nochmal ein CRLF oder so sende.

Hintergrund:
Ich sende von einem Mobiltelefon die RGB Werte für eine angeschlossene LED Kette, Beispiel String: "F:125,65,87"
das Programm zerlegt den String und stellt die Farben entsprechend ein. Das soll solange wiederholt werden bis es von der Farbe her paßt. Der 2. String der oben ausgewertet wird ist die Uhrzeit die vom Telefon übermittelt wird.

danke
Grüße
Patrick
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: Frage zu Uart.inpstr()

Beitrag14 Jan 2018 20:14:13

Hallo Patrick,
Code: Alles auswählen
Uart.inpstr()
ist nur für die direkte Eingabe von Daten über eine Terminal (von einen Benutzer) gedacht.

Als Lösung nutzen den Uart mit RX- und TX-Fifo und schreibe Dir bitte eine passende Funktion.

P.S. man kann über einen TimerN einen Zeitstempel anlegen, der eine Auflösung von 1ms und eine max. Größe von 2^32-1ms (32Bit) ~49,7 Tage hat.
Die abgelaufenen ms berechnet man wie folgt:
Code: Alles auswählen
dim start_msticks as long
start_msticks = T0.millis()
do
if ((T0.millis() - start_msticks ) >= 1000) then ' 1000ms == 1sec
 break
endif
loop
.
Siehe mein Projekt viewtopic.php?f=8&t=1408&p=9746#p9746 unter t0.class.luna und die Funktion: <long> millis().
Grüße Uwe
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: Frage zu Uart.inpstr()

Beitrag15 Jan 2018 14:53:31

ich mache es für einfache Sachen ungefähr so:

Code: Alles auswählen
if Usart.RxReady then
'Variablen nicht deklariert

uart_char = usart.readbyte
if uart_char  = 13 then

com_left = left(uart_string,4) ' Befehl auswerten
com_right = right(uart_string, len(uart_string)-4) ' Parameter auswerten
select case com_left

case "help"
print "tgld      = switch send data on or off"

case "tgld"
'do something...............

default


end select

uart_string=""
elseif uart_char  = 10 then
'linefeed wird nicht benutzt

else
uart_string += chr(uart_char)
endif

endif


Jedesmal, wenn ein Zeichen im Empfangsbuffer ist, hänge ich es an den String der schon empangenen Zeichen an. Wenn ein CR kommt, werte ich aus. Du kannst es nätürlich auf Länge etc. umstellen.

Jetzt könnte man das ganze nich in den Empfangsinterupt verlegen und Du bist unabhängig von der DO LOOP

Gruß
Ulrich
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: Frage zu Uart.inpstr()

Beitrag15 Jan 2018 17:34:27

meier13 hat geschrieben:Jetzt könnte man das ganze noch in den Empfangsinterrupt verlegen und Du bist unabhängig von der DO LOOP

Leider nicht, da der Empfangsinterrupt belegt ist, wenn der UartN mit RX-FiFo läuft.
Grüße Uwe
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: Frage zu Uart.inpstr()

Beitrag15 Jan 2018 18:07:01

oh hatte ich nicht gesehen.
Offline

PJAL

  • Beiträge: 43
  • Registriert: 27 Feb 2015 20:50:24

Re: Frage zu Uart.inpstr()

Beitrag15 Jan 2018 18:16:13

Uwe, Ulrich,
besten Dank euch beiden, das bekomme ich hin.

Grüße
Patrick
Grüße
Patrick

Zurück zu Sources, Projects / Quelltexte, Projekte

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron