
Zitat von
JoeM1978
Was an sich meine erste Vermutung dann bestätigen würde...
nämlich das die abarbeitung zu schnell abläuft und das nächste zeichen noch garnicht im Buff vorliegt.
Wie schon gesagt, das ganze Konzept ist kompletter Käse, Du hast das Prinzip Interrupt-gesteuerter Verarbeitung überhaupt nicht verstanden.
Der BYTEMATCH ist normalerweise dafür vorgesehen, das Ende einer Übertragung zu erkennen. Es ist nicht dafür gedacht den Anfang zu erkennen und dann solange in der ISR rumzurödeln und alles andere zu blockieren, bis man die Zeichenkette empfangen hat. Wofür soll dann der gepufferte Empfang überhaupt noch gut sein?
Das hier ist jetzt in ein paar Minuten entstanden und sollte eigentlich funktionieren. "Eigentlich", weil nicht auf Hardware getestet, aber vielleicht siehst Du die Idee.
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600
Const block_wait = 0
Const block_receive = 1
Const block_length = 16
Const False = 0
Const True = 1
Dim rx_state As Byte
Dim buff(block_length) As Byte
Dim data_block(block_length) As Byte
Dim db_index As Byte
Dim rcvd_char As Byte
Dim rcv_complete As Bit
Dim tmp As Byte
rx_state = block_wait
db_index = 0
rcv_complete = False
On URXC UART_Get_Char
Enable URXC
Enable Interrupts
Do
If rcv_complete = True Then
Printbin data_block(1)
rcv_complete = False
End If
Loop
UART_Get_Char:
rcvd_char = UDR
Select Case rx_state
Case block_wait:
If rcvd_char = "{" Then rx_state = block_receive
Case block_receive:
If rcvd_char <> "}" Then
If db_index < block_length Then
Incr db_index
buff(db_index) = rcvd_char
Else
db_index = 0
rx_state = block_wait
End If
Else
If db_index > 0 Then
tmp = memcopy(buff(1) , data_block(1) , db_index)
rcv_complete = True
End If
db_index = 0
rx_state = block_wait
End If
End Select
Return
Lesezeichen