Arduino Sketch - Объект в заголовочном файле, не содержащий значений - PullRequest
2 голосов
/ 21 января 2012

У меня есть следующее в Codes.h, к которому я обращаюсь, щелкая вкладку в программном обеспечении Arduino. Итак, я знаю, что эскиз загружается правильно с заголовочным файлом.

#ifndef __CODES_H__
#define __CODES_H__

PROGMEM prog_uint16_t show_hide_info[] = { 4216, 8900, 4380, 580, 500, 600, 500, 580, 1620, 580, 500, 600, 500, 580, 500, 600, 480, 600, 500, 580, 1620, 580, 1620, 600, 500, 580, 1620, 580, 1620, 600, 1600, 600, 1620, 580, 1620, 600, 500, 580, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 1620, 580, 1620, 600, 480, 600, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 39300, 8860, 2160, 580 };

#endif

Затем в моем коде есть метод, который использует массив show_hide_info[].

Проблема в том, что когда я пытаюсь получить доступ к массиву в заголовочном файле, он не содержит никаких значений.

Вместо этого, если я объявлю выше PROGMEM выше setup() метода, он содержит значения.

Не совсем уверен, почему у меня эта проблема. Я могу подтвердить, что правильно объявил свой заголовочный файл, выполнив следующее в моем наброске.

#include "Codes.h"

Это пример использования массива:

void sendCode(prog_uint16_t inArray[], int nLimit) {
  unsigned int arr[nLimit];
  unsigned int c;
  int index = 0;

  while ((c = pgm_read_word(inArray++))) {
    arr[index] = c;
    index++;
  }

  for (int i = 0; i < nLimit; i=i+2) {
    Serial.println(arr[i]);
    Serial.println(arr[i+1]);
  }
}

В консоли ничего не выводится, если я пытаюсь использовать массив в заголовочном файле. Это работает только в том случае, если я объявлю это в рамках моей основной программы эскизов.

Я знаю, что это не проблема с самим массивом или с моим методом в виде простой строки, или int тоже не работает. Очень странно.

1 Ответ

4 голосов
/ 21 января 2012

Что-то в этом духе работает для меня:

В верхней части эскиза просто:

#include "Codes.h"

Codes.h должно выглядеть так, чтобы работать:

#ifndef __CODES_H__
#define __CODES_H__

// Implicitly includes <avr/pgmspace.h> to provide access to progmem features
#include <Arduino.h>

// Split up declaration and definition to remove warning
extern const prog_uint16_t show_hide_info[] PROGMEM;
const prog_uint16_t show_hide_info[] = { 
  4216, 8900, 
  4380, 580, 
  500, 600, 
  500, 580, 
  1620, 580, 
  /* and so on... */
  0 // Need this to prevent sendCode reading beyond the end of this array
};

#endif
...