RingBuffer / Zeiger Problem

Gast #1153648
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.
Ralf wrote:

>
1
> if(!BufferOut(*pByte))
2
> {
3
>  ffwrite(pByte);
4
> }
5
>
>
> Wenn ich "Das ist ein Test" in den RingBuffer schreibe, erhalte ich mit
> diesem code "DDDDDDDDDDDDDDDD" zurück.
1
int main()
2
{
3
  uint8_t NextCharacter;
4

5
  ....
6

7
  while( 1 ) {
8
    ....
9

10
    if( BufferOut( &NextCharacter ) != FAIL ) {
11
      // mach was mit NextCharacter
12
    }
13
  }
14
}


Und kauf dir ein C-Buch. Parameter Passing und die Rolle die Pointer 
dabei spielen ist absolutes Basiswissen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.