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

4 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
  3. Mr. Sensor

    Guten Tag alle zusammen,

    für Interessierte hier noch folgender Nachtrag:
    https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
    Unter Berücksichtigung des oben eingefügten Links genügt es sogar sich einen beispielsweise einen Wert aus eurem in der Flash Memory gespeicherten Arrays wie folgt in den SRAM zu holen:

    //Hochladen in den Flashspeicher
    const datatype ArrayName[ ] PROGMEM = {Wert_1, Wert_2, Wert_3, etc., }
    /
    /von dem Flashspeicher in SRAM holen
    neuerNamedesWertes = pgm_read_word_near(ArrayName + PositiondesWertes);

    Wobei natürlich wieder darauf zu achten, dass der erste Wert im Array die Position 0 und nicht 1 erhält.

    Vielleicht hilft das ja dem ein oder anderen noch.

    Gruß
    Mr. Sensor

    P.S. Es wäre nett, falls sich noch jemand zu meinem Kommentar im Artikel „Die Auflösung des ADC vom Arduino UNO erhöhen auf 16 Bit mit Oversampling“ melden würde.

    http://shelvin.de/die-aufloesung-des-adc-vom-arduino-uno-erhoehen-auf-16-bit/#comment-35314

    Antworten

Schreibe einen Kommentar

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