Ich muss das ganze total anders machen.
Das muss in etwa so ablaufen, dass das Programm an den AVR nur senden darf, wenn dieser ein OK gibt (dass sein FIFO-Puffer leer ist bzw. er den letzten eingehenden String voll verarbeitet hat).
Genauso darf der AVR nur senden, wenn der PC sein ok gibt (kann erst mal vernachlässigt werden, der hat ja einen größeres FIFO-Puffer und ist wesentlich schneller in der Ausführung).
Nunja, da muss ich nochmal das Datenblatt zur Hand nehmen obs dafür spezielle Register gibt um den FIFO-Puffer beim AVR auszulesen, bzw. Flags für dessen Zustand zu setzen.
Das ganze sollte dann in etwa so aussehen:
Code:
' Interrupt muss auf jeden Fall verwendet werden!
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Main:
If N = 6 And S = "..." Then 'nur wenn String komplett und S = Blabla...
'Tue irgendwas....
Flag = 0 'Setze ein Flag, das dem PC sagt, dass er nun wieder senden darf
N = 0 'Setze den Zähler zurück, damit der alte String durch einen neuen überschrieben wird.
Waitms 500
End If
Goto Main
Onrxd:
'Zeichen dürfen nur entgegengenommen werden, wenn der AVR gerade keinen anderen String von der RS-232 verarbeitet. Ansonsten abbruch des Interrupts
Incr N 'Zähler für die aktuelle Länge des Strings
S_array(n) = Udr
If S_array(n) = 0 Then Flag = 1
'....
'Sobald ein Nullbyte kommt oder ein anderes vereinbartes Zeichen soll die Übertragung sofort abgebrochen werden und dem PC gesagt werden, dass er sämtliche Übertragungen erst mal einstellen soll bis ein OK kommt
Return
Hab ich die Semesterferien wohl was zu tun
Wenn irgendjemand ein paar Codeschnippsel, Methoden, Ratschläge oder Vorgehensweisen hat, (speziell wegen dem Problem mit dem String einlesen) wäre ich sehr dankbar.
EDIT: Ach ja, ich verwende einen ATmega128, sollte vielleicht auch gesagt sein.
Lesezeichen