Zitat Zitat von JoeM1978 Beitrag anzeigen
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