mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String durch ringbuffer Zeichenweise übertragen (rs232)


Autor: µC - noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe die uart Lib von Peter Fleury eingebunden und's läuft.

Ich würde jedoch gerne die while(*s) rausnehmen und ersetzen.

Dabei würde ich gerne einen zu schreibenden string über einen ringbuffer 
übertragen.
http://www.ssalewski.de/USB-Sources/

Wenn jetzt die while(1) durchlaufen wird, soll nun der erste char 
gesendet werden. Mit dem sendenErfolgreich-Interrupt soll dann ein 
weiter char des strings gesendet werden usw..., bis der string 
übertragen ist.

Dadurch soll der prozessor während des langen (ms) übertragungsprozess 
wieder frei für andere Dinge sein.

Ich hatte mir gedacht, dass ein solcher string im ram hinterlegt sein 
muss??

Habt ihr ne Idee wie ich das am besten anstelle??

Ich hab zwar den ringbuffer, aber wie kann ich den so einsetzen, dass 
der über einen string läuft??

Grüße

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Du benutzt die Funktionen aus der UART-Library von Peter Fleury
http://homepage.hispeed.ch/peterfleury/group__pfle...

Dort sind bereits zwei (Senden, Empfangen) Ringpuffer eingerichtet, die 
defaultmäßig je 32 Bytes gross sind. Die Grösse kann man aber auch 
anpassen (Defines in der Library).

Zum Senden schreibst du in den Senderingpuffer einzelne Zeichen mit 
uart_putc rein und komplette Strings mit uart_puts. Alles weitere macht 
die Library.

Autor: µC - noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich hab mich falsch ausgedrückt.


Hier mal ein beispiel:

Änderung der Stringfunktion aus Fleury-Lib(nur Bsp)
char *s = "hallo";

void uart_puts(void)
{
    if(*s)
  { 
      uart_putc(*s++);
  }

}/* uart_puts */

Aufruf durch main:
void main(void)
{
while(1)
{
  uart_puts();
}
}

Das problem ist jetzt, das die Adresse nicht mehr zurückgesetzt wird.
Eventuell kommt auch noch ein weiterer String dazu, obwohl die 
übertragung noch nicht komplett ist.

Daher wollte ich für das auslesen des Strings einen weiteren ringbuffer 
einsetzen.

Ist das klug??
Wie stellt man das an??

Gruß

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1/ Es ist nicht klug, eine Libraryfunktion mit definierter 
Argumentübergabe durch eine gleichnamige eigene Funktion mit geänderter 
Argumentübergabe zu ersetzen.

2/ In deinem 1. Beispiel hapert es, dass du einen globale Zeiger statt 
einem lokalen Funktionsargument benutzt. Klar, dass dadurch der globale 
Zeiger manipuliert wird. Die Ersatzfunktion sollte auch mit einem 
Argument arbeiten.
char *s = "hallo";

void mein_uart_puts(char *s)
{
  if (s) // auf Nullpointer checken bevor Zugriff (*s) erfolgt
  {
     while (*s)  // ALLE Zeichen von s bis zum ersten Nullbyte ausgeben
     { 
        uart_putc(*s++);
     }
  }
}/* mein_uart_puts */

// Aufruf durch main
int main (void)
{
  while(1)
  {
     mein_uart_puts(s); // immer wieder Text "hallo" ausgeben
  }
  return 0;
}

Innerhalb von mein_uart_puts wird das Funktionsargument s als Zeiger 
benutzt. Das ist ein lokaler Zeiger s, nicht der globale Zeiger s. Der 
globale Zeiger s bleibt ohne Änderung!
http://www.roboternetz.de/wissen/index.php/C-Tutor...

Wenn du hier beim Gültigkeitsbereich von Zeigern (und Variablen) 
Verständnisprobleme hast, solltest du dir was Gutes tun und ein C 
Tutorial zu Rate ziehen. Längerfristig brauchst du das Verständnis, wenn 
du weiter C programmieren willst.

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.