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


von µC - noob (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ja. Du benutzt die Funktionen aus der UART-Library von Peter Fleury
http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html

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.

von µC - noob (Gast)


Lesenswert?

Sorry, ich hab mich falsch ausgedrückt.


Hier mal ein beispiel:

Änderung der Stringfunktion aus Fleury-Lib(nur Bsp)
1
char *s = "hallo";
2
3
void uart_puts(void)
4
{
5
    if(*s)
6
  { 
7
      uart_putc(*s++);
8
  }
9
10
}/* uart_puts */

Aufruf durch main:
1
void main(void)
2
{
3
while(1)
4
{
5
  uart_puts();
6
}
7
}

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ß

von Stefan B. (stefan) Benutzerseite


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.
1
char *s = "hallo";
2
3
void mein_uart_puts(char *s)
4
{
5
  if (s) // auf Nullpointer checken bevor Zugriff (*s) erfolgt
6
  {
7
     while (*s)  // ALLE Zeichen von s bis zum ersten Nullbyte ausgeben
8
     { 
9
        uart_putc(*s++);
10
     }
11
  }
12
}/* mein_uart_puts */
13
14
// Aufruf durch main
15
int main (void)
16
{
17
  while(1)
18
  {
19
     mein_uart_puts(s); // immer wieder Text "hallo" ausgeben
20
  }
21
  return 0;
22
}

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-Tutorial#G.C3.BCltigkeitsbereich

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.