mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RingBuffer / Zeiger Problem


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende den RingBuffer aus dem Artikel 
http://www.mikrocontroller.net/articles/FIFO#2n-Ri...
#define BUFFER_SIZE 16 // muss 2^n betragen (8, 16, 32, 64 ...)
#define BUFFER_MASK (BUFFER_SIZE-1) // Klammern auf keinen Fall vergessen
 
struct Buffer {
  uint8_t data[BUFFER_SIZE];
  uint8_t read; // zeigt auf das Feld mit dem ältesten Inhalt
  uint8_t write; // zeigt immer auf leeres Feld
} buffer = {{}, 0, 0};
 
uint8_t BufferIn(uint8_t byte)
{
  uint8_t next = ((buffer.write + 1) & BUFFER_MASK);
  if (buffer.read == next)
    return FAIL;
  buffer.data[buffer.write] = byte;
  // buffer.data[buffer.write & BUFFER_MASK] = byte; // absolut Sicher
  buffer.write = next;
}
 
uint8_t BufferOut(uint8_t *pByte)
{
  if (buffer.read == buffer.write)
    return FAIL;
  *pByte = buffer.data[buffer.read];
  buffer.read = (buffer.read+1) & BUFFER_MASK;
  return SUCCESS;
}

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!
if(!BufferOut(*pByte))
{
 ffwrite(pByte);
}

Wenn ich "Das ist ein Test" in den RingBuffer schreibe, erhalte ich mit 
diesem code "DDDDDDDDDDDDDDDD" zurück.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:

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

  ....

  while( 1 ) {
    ....

    if( BufferOut( &NextCharacter ) != FAIL ) {
      // mach was mit NextCharacter
    }
  }
}


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.