Einen String im Flashspeicher mit PROGMEM ablegen und ausgeben

Der SRAM Speicher beim Arduino Uno und Nano hat 2 kByte für Variablen und Strings.
> Infos zum Arduino Speicher.

Das reicht manchmal nicht aus um alle Strings zu speichern und dann kann der Programmspeicher (FLASH) zusätzlich verwendet werden. Hier stehen immerhin 32 kByte zur Verfügung, abzüglich Programm und Bootloader. Dazu gibt es zwei Möglichkeiten.

1. Mit F() wir ein Feld definiert, dass im Programmspeicher liegen soll.

#define Ausgabe F("Dies ist ein langer Satz.")

Das kann ganz normal mit Serial.println(Ausgabe); gesendet werden.

2. Mit PROGMEM kann eine Konstante im Programmspeicher abgelegt werden. Eine Beschreibung ist hier.

const char satz[] PROGMEM = "Und noch ein langer zweiter Satz.";

Die Ausgabe ist dann etwas komplizierter und wird mir dieser Funktion erledigt.

void PPrintln(const prog_char str[]) {
// PROGMEM print line
  char c;
  while((c = pgm_read_byte(str++))) // alle chars lesen
    Serial.write(c);   // und ausgeben
  Serial.write('\n');  // neue Zeile
}

Und wird dann einfach aufgerufen mit PPrintln(satz);

Das fertige Programm

// String aus dem Programmspeicher ausgeben
// 1. mit #define 
// 2. mit char[] PROGMEM
//
// Matthias Busse Version 1.0 vom 2.11.2014

#define Ausgabe F("Dies ist ein langer Satz.")

const char satz[] PROGMEM = "Und noch ein langer zweiter Satz.";

void setup() {
  Serial.begin(38400);
}

void loop() {
  Serial.println(Ausgabe);
  PPrintln(satz);  
  delay(1000);
}

void PPrintln(const prog_char str[]) {
// PROGMEM print line
  char c;
  while((c = pgm_read_byte(str++))) // alle chars lesen
    Serial.write(c);   // und ausgeben
  Serial.write('\n');  // neue Zeile
}

von Matthias Busse

3 Gedanken zu „Einen String im Flashspeicher mit PROGMEM ablegen und ausgeben

  1. Dirk

    die Funktion PPrintln() wird eigendlich nicht benötigt,
    man kann einfach schreiben:
    Serial.print((const __FlashStringHelper *) satz);

    Antworten
  2. soundso

    [zitat]
    2. Mit PROGMEM kann eine Variable im Programmspeicher abgelegt werden. Eine Beschreibung ist hier.

    const char satz[] PROGMEM = „Und noch ein langer zweiter Satz.“;
    [/zitaz]

    [Klugscheissmodus]
    wenns const ist nennt sich das Konstante nicht Variable …
    [/Klugscheissmodus]

    gruess

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.