Stringkette bestimmter Länge über UART empfangen
Hallo
Ich stehe vor folgendem Problem...
Mein AVR bekommt über die UART Zeichenketten, die immer 6 Zeichen lang sind (ohne Nullbyte). Diese Zeichenkette soll er in einen String speichern.
Sobald das erste Zeichen reinflattert soll der AVR dieses entgegennehmen und so lange warten bis die übrigen 5 Zeichen ebenfalls gespeichert sind. Erst dann soll er den String auswerten. Und erst wenn dieser String ausgewertet ist soll der nächste entgegengenommen werden.
Ich scheitere momentan vor allem daran, dass der AVR wirklich so lange wartet, bis er einen 6-stelligen String hat.
Das ganze sollte sollte wenn möglich in einer Interruptroutine ablaufen.
Ich habs schon mit diversen Arrays probiert, For-Schleifen, If-Bedingungen etc. aber nichts wollte funktionieren. Oft auch deswegen, dass der AVR dann Teile verschluckt hat.
So sollte das grobe Gerüst aussehen, bzw. hab ichs mir vorgestellt
Code:
'....
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Dim S As String * 6
Dim S_array(7) As Byte At S Overlay
'.....
Main:
'....
Goto Main
Onrxd:
Incr N
S_array(n) = Udr
Return
So nimmt er immer sobald ein neues Zeichen kommt dieses im Array auf und schreibt es in den String. Und wenn ich da drumrum noch irgendwelche Konstrukte mache geht gar nichts mehr.
Ich hab mir gedacht, dass es am besten wäre, wenn der AVR so lange eingehende Zeichen aufnimmt bis er zum Nullbyte kommt und dort dann abbricht bzw. aus der Interrupt-Routine springt. Nur wie mach ich dem das klar? :-k
Re: Stringkette bestimmter Länge über UART empfangen
Zitat:
Zitat von Foooob
Sobald das erste Zeichen reinflattert soll der AVR dieses entgegennehmen und so lange warten bis die übrigen 5 Zeichen ebenfalls gespeichert sind. Erst dann soll er den String auswerten. Und erst wenn dieser String ausgewertet ist soll der nächste entgegengenommen werden.
Ich scheitere momentan vor allem daran, dass der AVR wirklich so lange wartet, bis er einen 6-stelligen String hat.
.
.
.
Hallo,
mit nachfolgendem Code wartet der AVR zunaechst auf ein bestimmtes Zeichen oder eine Zeichenfolge. In meinem Beispiel horcht der AVR auf ein "a".
Anschliessend liest der AVR die naechsten anstehenden Zeichen ein und speichert diese in die Stringvariable "zeichen".
Das ganze ist eine Endlosschleife. Mit diesem Programmschnipsel habe ich erfolgreich in einem anderen Projekt die Daten einer GPS-Mouse (Koordinaten, Geschwindigkeit usw. ) eingelesen.
Der Code basiert auf einem Beispiel aus dem Buch von Claus Kuehnel "Programmieren der AVR-Risc...") - na, kennt hier ja jeder...
Code:
$lib "glcdKS108.lib"
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 4800
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portb , Ce = 1 , Ce2 = 0 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
Config Serialin = Buffered , Size = 10
Declare Function Read_string(byval T As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Enable Interrupts
Dim Zeichen As String * 6
Setfont 6x8font
Cls
Lcdat 1 , 1 , "wait_for_string"
Do
Print "test"
Call Wait_for_string( "a")
'Zeichen = Read_string(8)
Print "Alles wird gut"
Lcdat 3 , 1 , "Zeichen a empfangen"
waitms 500
Loop
End
Sub Wait_for_string(byval S As String) As String
Local Ii As Byte
Local Cc As Byte
Ii = 1
M1:
Cc = Waitkey()
If Cc <> Mid(s , Ii , 1) Then
Goto M1
Else
Incr Ii
If Ii > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval T As Byte) As String
Local Cc As Byte
Local Ss As String * 10
Ss = ""
Do
Cc = Waitkey()
Ss = Ss + Chr(cc)
Loop Until Cc = ","
Read_string = Left(ss , T)
End Function
$include "6x8font.font"
Screenshot: http://www.elektronik-web.de/atmel/r...tforstring.gif
Drahtigel: http://www.elektronik-web.de/atmel/roboternetz/wfs.jpg
Vielleicht hilft es ja etwas weiter...
Mit freundlichen Gruessen
Digitali