Hallo,
ich verwende den RingBuffer aus dem Artikel
http://www.mikrocontroller.net/articles/FIFO#2n-Ringpuffer_-_die_schnellste_L.C3.B6sung
1 | #define BUFFER_SIZE 16 // muss 2^n betragen (8, 16, 32, 64 ...)
|
2 | #define BUFFER_MASK (BUFFER_SIZE-1) // Klammern auf keinen Fall vergessen
|
3 |
|
4 | struct Buffer {
|
5 | uint8_t data[BUFFER_SIZE];
|
6 | uint8_t read; // zeigt auf das Feld mit dem ältesten Inhalt
|
7 | uint8_t write; // zeigt immer auf leeres Feld
|
8 | } buffer = {{}, 0, 0};
|
9 |
|
10 | uint8_t BufferIn(uint8_t byte)
|
11 | {
|
12 | uint8_t next = ((buffer.write + 1) & BUFFER_MASK);
|
13 | if (buffer.read == next)
|
14 | return FAIL;
|
15 | buffer.data[buffer.write] = byte;
|
16 | // buffer.data[buffer.write & BUFFER_MASK] = byte; // absolut Sicher
|
17 | buffer.write = next;
|
18 | }
|
19 |
|
20 | uint8_t BufferOut(uint8_t *pByte)
|
21 | {
|
22 | if (buffer.read == buffer.write)
|
23 | return FAIL;
|
24 | *pByte = buffer.data[buffer.read];
|
25 | buffer.read = (buffer.read+1) & BUFFER_MASK;
|
26 | return SUCCESS;
|
27 | }
|
Ich fülle ihn mit daten aus dem UART in der ISR. Das klappt wunderbar.
In der Main loop möchte ich nun zyklisch testen, ob noch etwas im Buffer
steht und wenn ja, auf eine SD-Karte schreiben.
Und hier habe ich offensichtlich einen Knoten bzgl. des Zeigers in
meinen Gedanken!
1 | if(!BufferOut(*pByte))
|
2 | {
|
3 | ffwrite(pByte);
|
4 | }
|
Wenn ich "Das ist ein Test" in den RingBuffer schreibe, erhalte ich mit
diesem code "DDDDDDDDDDDDDDDD" zurück.