Hallo,
ich verwende einen Mega328P um serielle Daten zu verarbeiten. Der uC
empfängt vom HUART, verarbeitet die Daten und sendet sie via SUART.
Umgekehrt das gleiche vorgehen. Das Projekt ist auch schon fertig und
tut was es soll, nur bei einer Kleinigkeit bräuchte ich etwas Hilfe:
Der UART empfängt so lange bis die Steuerzeichen Cr und Lf empfangen
werden. Der Inhalt der empfangenen Daten wird in einer String-Variable *
30 gespeichert. Um zu verhindern, dass die Variable im Fehlerfall
überläuft, überprüft die Routine bei jedem Empfangenen Zeichen, ob die
30 Zeichen schon voll sind. Würde dieser Fehlerfall eintreten, soll
folgendes passieren:
- Interrupts deaktivieren -> kein Problem
- Diverse Variablen zurücksetzen -> kein Problem
- Fehlercode 2 Sek. per LEDs ausgeben -> kein Problem
- UART Empfangspuffer leeren, d.h. alle Daten die empfangen wurden,
innerhalb der letzten 2 Sekunden (also während der Fehlercode via LEDs
angezeigt wird) sollen verworfen werden -> hier bin ich etwas Ratlos
- Interrupts wieder aktivieren -> kein Problem
Ich möchte also nicht, dass der Interrupt für den Empfang eines Bytes
ausgelöst wird, nachdem dieser reaktiviert wurde. Dazu habe ich mir das
Datenblatt angesehen (S. 192), bin mir aber nicht sicher, ob das so
funktionieren kann:
1 | Sub ClearBuffers()
|
2 | Get #2 , byCurCharSW 'SUART Puffer leeren
|
3 | byCurCharSW = 0
|
4 | UCSR0B.RXCIE0 = 0 'Status-Register des HUART zurücksetzen
|
5 | Enable URXC
|
6 | End Sub
|
Hier noch die Ausschnitte aus dem Datenblatt, die ich zu Rate gezogen
habe:
20.11.2 UCSRnA – USART Control and Status Register n A
Bit 7 – RXCn: USART Receive Complete
This flag bit is set when there are unread data in the receive buffer
and cleared when the receive buffer is empty
(i.e., does not contain any unread data). If the Rece
iver is disabled, the receive buffer will be flushed and
consequently the RXCn bit will become
zero. The RXCn Flag can be used
to generate a Receive Complete
interrupt (see description of the RXCIEn bit).
20.11.3 UCSRnB – USART Control and Status Register n B
Bit 7 – RXCIEn: RX Complete Interrupt Enable n
Writing this bit to one
enables interrupt on the RXCn Flag. A
USART Receive Complete interrupt will be
generated only if the RXCIEn bit is written to one, the
Global Interrupt Flag in SREG is written to one and the
RXCn bit in UCSRnA is set.
Kann das so funktionieren, wie ich es umgesetzt habe, oder gibt es einen
anderen Weg für diese Problemstellung?
Schon mal Danke und schönen Gruß,
Michael