Forum: Compiler & IDEs Printf und String im Flash


von Marian (Gast)


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:
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
#include <stdio.h>
4
5
int main(void)
6
{
7
 Uart_init();
8
 while(0)
9
 {
10
  printf(PSTR ("Hallo Welt!"));
11
 }
12
}

Gruß,

Marian

von Karl H. (kbuchegg)


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:
>
1
> #include <avr/io.h>
2
> #include <avr/pgmspace.h>
3
> #include <stdio.h>
4
> 
5
> int main(void)
6
> {
7
>  Uart_init();
8
>  while(0)
9
>  {
10
>   printf(PSTR ("Hallo Welt!"));
11
>  }
12
> }
13
>
>

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.

von Oliver (Gast)


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

von Marian (Gast)


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

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.