читать строковые данные в arduino из заголовочного файла (wavehare Eink) - PullRequest
0 голосов
/ 12 мая 2018

Geetings, я пытаюсь прочитать строковые файлы в arduino из заголовочного файла (.h). Это хорошо, но я не могу назвать строку. Когда я последовательно печатаю строку, на мониторе появляется только тарабарщина. Это мой код Arduino:

#include <epd4in2.h>
#include <epdif.h>
#include <epdpaint.h>
#include <fonts.h>

#include <SPI.h>
#include "epd4in2.h"
#include "imagedata.h"
#include "epdpaint.h"

#include "list.h"

#define COLORED     0
#define UNCOLORED   1

String test1;
String test2;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.print("port test");

  Epd epd;

  if (epd.Init() != 0) {
    Serial.println("e-Paper init failed");
    return;
  }

  test1 = String(DATA_1[0]);\
  Serial.println(test1);
  test2 = String(DATA_1[1]);
  Serial.println(test2);

  /* This clears the SRAM of the e-paper display */
  epd.ClearFrame();

 /* Due to RAM not enough in Arduino UNO, a frame buffer is not allowed. */
 unsigned char image[1500];
 Paint paint(image, 400, 28);    //width should be the multiple of 8 

 paint.Clear(UNCOLORED);
 paint.DrawStringAt(0, 0, "test1", &Font24, COLORED);
 epd.SetPartialWindow(paint.GetImage(), 100, 40, paint.GetWidth(), 
 paint.GetHeight());

 paint.Clear(COLORED);
 paint.DrawStringAt(100, 2, "test2", &Font24, UNCOLORED);
 epd.SetPartialWindow(paint.GetImage(), 0, 64, paint.GetWidth(), 
 paint.GetHeight());

 /* This displays the data from the SRAM in e-Paper module */
 epd.DisplayFrame();

 /* Deep sleep */
 epd.Sleep();
 }

void loop() {
  // put your main code here, to run repeatedly:

}

и вот данные в .h файле:

extern const String DATA_1[] PROGMEM = { "bat", "2244"}; 
extern const String DATA_2[] PROGMEM = { "bmp", "15662"}; 
extern const String DATA_3[] PROGMEM = { "docx", "16670"}; 
extern const String DATA_4[] PROGMEM = { "jpg", "150645"}; 
extern const String DATA_5[] PROGMEM = { "mp3", "9882324"}; 
extern const String DATA_6[] PROGMEM = { "txt", "807"}; 
extern const String DATA_7[] PROGMEM = { "url", "118"};

Я создал этот список, используя скрипт .bat.

Я довольно новичок в этом, поэтому любая помощь будет оценена. С наилучшими пожеланиями, Луиджи

1 Ответ

0 голосов
/ 14 мая 2018

Когда вы используете PROGMEM, инициализированное значение сохраняется в памяти программы, а переменной присваивается указатель на местоположение.

Но когда вы используете

test1 = String(DATA_1[0]);

,Поиск кода с тем же адресом в оперативной памяти, а не в памяти программы.

Вы можете прочитать об этом здесь.https://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Я сталкивался с той же проблемой раньше, но я хранил байты, а не строки.Так что я смог сойти с рук с помощью pgm_read_byte.Возможно, вам придется приложить некоторые усилия, чтобы заставить программу работать.

Надеюсь, это поможет и удачи.

...