mikrocontroller.net

Forum: Compiler & IDEs Printf und String im Flash


Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte nur mal wissen ob es möglich ist, einen String aus dem Flash 
direkt per Uart zu versenden.
Also so in der Art:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>

int main(void)
{
 Uart_init();
 while(0)
 {
  printf(PSTR ("Hallo Welt!"));
 }
}

Gruß,

Marian

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

Bewertung
0 lesenswert
nicht lesenswert
Marian wrote:
> Hallo,
>
> ich wollte nur mal wissen ob es möglich ist, einen String aus dem Flash
> direkt per Uart zu versenden.
> Also so in der Art:
>
> #include <avr/io.h>
> #include <avr/pgmspace.h>
> #include <stdio.h>
> 
> int main(void)
> {
>  Uart_init();
>  while(0)
>  {
>   printf(PSTR ("Hallo Welt!"));
>  }
> }
> 
>

mit printf selber geht das nicht. printf geht immer davon aus,
dass der String im SRAM liegt. Aber printf hat einen speziellen
Formatbezeichner, der ihm sagt, dass ein String aus dem
Flash kommt

   printf( "%S", PSTR("Hallo Welt" ) );

(Ich weiss jetzt gar nicht, ob es einen printf_P gibt, der
den Format String im Flash erwartet, dann würde das direkt
gehen
     printf_P( PSTR("Hallo Welt" ) );
)

> einen String aus dem Flash
> direkt per Uart zu versenden.

und so einfach geht das mit dem versenden über die UART auch
wieder nicht. Man kann zwar mit einer speziellen Funktion die
Ausgabe der Standardfunktionen auf die UART umleiten. Allerdings
ist es meist deutlich einfacher, die UART Funktionen (die man
selber schreiben muss), direkt zu benutzen. Nicht zuletzt deshalb,
weil die Standard Ausgabefunktionen dann doch schon einiges
an Overhead mitbringen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja,
aber nicht mit printf. Dafür gibt es die Funktion printf_P.

Das zieht sich durch die ganze avr-libc. Zu vielen Funktionen gibt es 
eine _P-Variante für Daten aus dem flash.

Steht sogar alles in der Doku...

Oliver

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz und Oliver:
Danke für die ausführliche Antwort. printf_P muss ich dann wohl 
übersehen haben.

PS:Hm ich werde das mal mit den Uartfunktionen testen, mal schauen wie 
viel das bringt :).

Ciao,

Marian

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.