www.mikrocontroller.net

Forum: Compiler & IDEs Uart Buffer verwenden


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich stecke gerade etwas mit dem buffer der avrlib fest.

es kommt ein zeichen über uart0 rein, dann wird das zeichen in den 
buffer kopiert:

bufferAddToEnd(&uartRxBuffer[0], charIn);

und jetzt soll das zeichen wieder interruptgesteuert aus dem buffer an 
uart0 gesendet werden.

kann mir jemand helfen wie es weitergeht?

uartSendBuffer(0,???);

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bufferAddToEnd(&uartRxBuffer[0], charIn);
> uartSendBuffer(0,???);

Du meinst die Procyon AVRlib
http://www.mil.ufl.edu/~chrisarnold/components/mic...

Die gesuchte Funktion (Anhängen eines Zeichens an den zuvor 
eingerichteten Sendepuffer) wäre uartAddToTxBuffer(charIn)

> bufferAddToEnd(&uartRxBuffer[0], charIn);

Diese Konstruktion ist IMHO sehr ungewöhnlich. Ich würde vom 
Hauptprogramm aus den Empfangspuffer schön in Ruhe lassen. Normalerweise 
würde deine gesamte Abfrage (Emfangen und Echo zurücksenden) so aussehen

  {
    u08 charIn;
    if (uartReceiveByte(&charIn))
      uartAddToTxBuffer(charIn);
  }

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uartAddToTxBuffer(0, charIn);

ok, jetzt ist das zeichen im buffer.

wie wird der buffer jetzt gesendet?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei:

uartSendTxBuffer(0);
wird  \0\0\0\0 gesendet.

Es kommen aber Zeichen an.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> uartAddToTxBuffer(0, charIn);

Du hast meine Antwort nicht verstanden und bist dem Link nicht wirklich 
nachgegangen. Hättest du das gemacht, hättest du dort gesehen, wie die 
Funktion definiert ist:

// add byte to end of uart Tx buffer
u08 uartAddToTxBuffer(u08 data)
{
  //...
}

Schon die Zahl der Argumente in deinem Code passt nicht.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir ist das so definiert:

void uartAddToTxBuffer(u08 nUart, u08 data)
{
  bufferAddToEnd(&uartTxBuffer[nUart], data);
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aus uart2.c, d.h. die Library mit zwei Puffern.
http://www.mil.ufl.edu/~chrisarnold/components/mic...

// Description  : This is a UART driver for AVR-series processors with two
//                hardware UARTs such as the mega161 and mega128 

nUart ist die Nummer des UARTs (0 oder 1)
data ist das zu sendende Zeichen (0x00 bis 0xFF)

#include "buffer.h"
#include "uart2.h"

//...

  {
     char *s = "Hello world!";

     uartInit();

     while(*s)
       uartAddToTxBuffer(0, *s++); // UART0 TX Buffer füllen

     uartSendTxBuffer(0);          // UART0 Senden einschalten
  }

//...


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stefan,

jetzt bin ich durch deine Hilfe schon etwas weiter.

Der buffer wird befüllt.

Aber das auslesen des buffers sollte anderst laufen.

Die Zeichen die über uart reinkommen sollen durchgeschleift werden, das 
heißt gleich wieder rausschicken auf die uart.

ohne buffer wäre das ja so:

1. Zeichen kommt rein   Zeichen = UDR1
2. Zeichen an uart      UDR0 = Zeichen

ich denke so soll man es nicht machen, wie mache ich das mit buffer?

1. uartAddToTxBuffer(0, Zeichen);
2.

mit uartSendTxBuffer(0); wir der buffer gesendet, aber aufruf in main 
kann doch zu oft, oder zu spät sein oder?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#define UART0 0
#define UART1 1

// ...
u08 TXaktiv;

  while(1)
  {
    u08 rxData;

    if (uartReceiveByte(UART1, &rxData))
    {
      uartAddToTxBuffer(UART0, rxData);
      TXaktiv++;
    }

    // irgendwann wenn z.B. genug Zeichen im TX-Puffer sind
    // TX starten
    if (TXaktiv >= 23)
      uartSendTxBuffer(UART0);

    // Anm.: Ich habe keine einfache Funktion gefunden, mit der 
    // man dieses interruptbasierte Senden aus dem Puffer nach
    // Wunsch stoppen kann. Man kann es wohl nur an schalten und
    // dann laufen lassen. Mehrfachaufruf schadet aber nicht.
  }

// ...

EDIT: Eine Alternative wäre TXaktiv++; wegzulassen und die if-Abfrage so 
zu machen, um den Mehrfachaufruf zu vermeiden.

    if (!TXaktiv)
    {
      uartSendTxBuffer(UART0);
      TXaktiv = 1;
    }

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo setzt du TXaktiv auf 0

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Hochzählen in Alternative 1 ist eigentlich Käse. Ich habe mir 
irgendwas aus den Fingern gesogen, um ein Beispiel zu haben, das einen 
Puffer halbwegs rechtfertigt.

Bei der Alternative 2 (ohne Hochzählen) wird TXaktiv bewusst nirgends 
zurückgesetzt. Das Senden ist einmal angestossen worden und läuft ab 
dann im Interrupt nebenher immer weiter. TXaktiv != 0 verhindert 
einfach, dass das Senden noch mal angestossen wird (wäre aber folgenlos, 
wenn es doch geschähe).

Autor: Bernd bömer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite auch mit dieser Lib und versuche mit einem ATMega128 ein 
String ("$BM,1666.123 m<CR>"aus 9..12 Zeichen(0.000 m ..1666.123 m) zu 
empfangen und daraus die Zahlen auf einem LC -Display daszustellen..
Wie kann ich das einlesen?
Mfg Bernd

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.