Hallo,
ich sehe da keinen UART-Ringbuffer !
Man hat immer einen Schreib- und einen Lesezeiger.
In einer einfachen Abbildung des Ringbuffer ist dieser leer, wenn
(Schreibzeiger == Lesezeiger) ist.
Dem Zufolge ist der Ringbuffer voll, wenn (UEBERLAUF(Schreibzeiger,
RINGBUFFER_SIZE) == Lesezeiger) ist.
Hier noch die Definition des Macros:
1 | #define UEBERLAUF( x, max ) x = ++x >= max ? 0 : x
|
Man benötigt also drei Funktionen:
a) ist ein Zeichen im Ringpuffer ? (Hauptprogramm)
b) Lese ein Zeichen aus dem Ringpuffer. (Hauptprogramm)
c) Schreibe ein Zeichen in den Ringpuffer, das macht dann die ISR.
---
Dein Code ist nicht vollständig, da
nirgendwo definiert ist!
Ich würde ihn als
1 | #define RINGBUFFER_SIZE 32
|
2 | volatile char uart1_string[RINGBUFFER_SIZE];
|
anlegen.
Stephan schrieb:
> ISR (USART1_RX_vect)
> {
> unsigned char nextChar;
> nextChar = UDR0;
> if (nextChar != '\n')
> {
> uart1_string[uart1_str_count] = nextChar;
> uart1_str_count++;
> }
> }
Link
Hier findet man solch einen Ringpuffer:
[1] Beitrag "Software UART mit FIFO"