PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Befehle über RS232



elkokiller
23.08.2008, 16:18
Hallo,

habe mal eine, für viele, sicher ganz einfache Frage.
Ich möchte mit dem PC Anweisungen über die serielle Schnittstelle senden.
Der AVR-Empfänger, ein Mega32, arbeitet allerdings ein Programm ab und soll quasi via Interrupt auf die Eingabe über RS232 reagieren.
Bisher habe ich nur Input gefunden. Dabei wird allerdings das Programm so lange angehalten bis eine Nachricht ankommt.
Ein weiter Punkt ist die Verarbeitung der kompl. Nachricht.
Ich habe das so verstanden dass quasi jedes Zeichen eine Nachricht darstellt.
Wie bekomme ich da einen kompl. Befehl zusammen?

Tobias

for_ro
23.08.2008, 16:47
Du kannst deinen Befehl immer mit dem gleichen Zeichen abschließen, z.B. mit einem <CR>. Dann kannst du im Programm festlegen, dass der µC erst dann reagieren soll, wenn dieses Zeichen empfangen wurde.

Config Serialin = Buffered , Size = 20 , Bytematch = 13

Hier liest er also max. 20 Zeichen in den Puffer und springt dann eine Sub an, die bei dem Label (ist fix vorgegeben) steht:

Serial0CharMatch:

Dort kannst du dann über eine kleine Schleife die Bytes einlesen


Serial0CharMatch:
Command_count = 0
Command_string = ""
While Ischarwaiting() = 1
Command_key = Inkey()
If Command_key <> Chr(13) Then
Incr Command_count
If Command_count < 20 Then
Command_string = Command_string + Chr(command_key)
End If
End If
Wend
Clear Serialin
Return

wobei die Variablen so definiert sind:

Dim Command_key As Byte
Dim Command_count As Byte
Dim Command_string As String * 20

Gruß

Rolf

elkokiller
23.08.2008, 16:59
super, ich werde es gleich mal ausprobieren,

Danke O:)

elkokiller
23.08.2008, 17:10
gleich mal eine Frage,
was bedeutet Bytematch = 13?
Wird das hier benötigt?

for_ro
23.08.2008, 17:24
Das ist das Zeichen, auf das er wartet, in diesem Fall ein <CR>

elkokiller
23.08.2008, 17:31
mmh, das verstehe ich nicht ganz.
Die Prüfung ob Chr(13) oder 20 Zeichen eingeben wurden erfolgt doch in der Sub.
Um dort hin zu gelangen muss doch die eigentliche Abfrage vorher laufen!

for_ro
23.08.2008, 17:43
Nein, der Test auf <CR> wird unabhängig von deinem Programm gemacht. Das ist im UART integriert. Du brauchst dazu nur das Zeichen anzugeben. Alles was kommt wird in einen Puffer geschrieben, damit hast du auch nichts zu tun. Erst wenn das Zeichen auftaucht, wird der Interrupt ausgelöst und du kannst die Zeichen aus dem Puffer eins nach dem anderen einlesen.
Ich test in der Sub auch noch mal auf 13, aber das ist nur, weil ich das <CR> nicht in meinem String haben will.

for_ro
23.08.2008, 17:47
Ich habe übrigens oben noch mal den Clear Befehl geändert.

elkokiller
23.08.2008, 17:48
edit:

Hallo zusammen,

nach dem Ansatz von for_ro habe ich noch ein wenig weiter gesucht und eine Funktion gefunden.
Ich stelle die hier allen zur Verfügung die ein ähnliches Problem haben wie ich:



$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600


Dim S As String * 10
Dim B(11) As Byte At S Overlay
Dim N As Byte

On Urxc Onrxd
Enable Urxc
Enable Interrupts



Main:

If N > 9 Then
Print S
N = 0
End If

Goto Main




Onrxd:
Incr N
B(n) = Udr
Return

:-b \:D/ :-b \:D/