Не верно работает преобразование PGM-строк

Добрый день.
Подскажите, почему не верно работает код?
У меня есть функция, которая мне возвращает строку. Мне это необходимо, чтобы в дальнейшем при помощи регулярных выражений её прочитать и вывести в программе.

  1. Если в функции Parse_Msg в блоке «case 1:» использовать строку «Message = Macros (NumberOfMistakes, 0);», а в блоке «case 2:» такая же строка закомментирована, то все работает корректно, строка собирается полностью (<Message_1> Ворота открыты </1_Message>)
  2. Если в функции Parse_Msg в блоке «case 1:» использовать строку «Message = Macros (NumberOfMistakes, 0);», а в блоке «case 2:» такая же строка не закомментирована, строка собирается не корректно (<Message_1></1_Message>)
#define FPSTR(pstr) (const __FlashStringHelper*)(pstr)  // Преобразование PGM-строк

const char Msg_1[]      PROGMEM = "Ворота открыты";
const char Msg_2[]      PROGMEM = "Ворота закрыты";
const char Msg_3[]      PROGMEM = "Нет связи с пультом";
const char Msg_4[]      PROGMEM = "Отсутствие обратной связи с мотором";
const char Msg_5[]      PROGMEM = "Ворота открыты не полностью";
const char Msg_6[]      PROGMEM = "Ворота закрыты не полностью";
const char Msg_7[]      PROGMEM = "Включение световой индикации";
const char Msg_8[]      PROGMEM = "Световая индикация выключена";
const char* const Msg_OK[] PROGMEM = { Msg_1, Msg_2, Msg_3, Msg_4, Msg_5, Msg_6, Msg_7, Msg_8 };

uint8_t NumberOfMistakes = 0; // Количество сообщений

String Macros(int _NumberOfMistakes, int _NumberOfArray){
  String _Message = "";

    _Message = ("<Message_"); 
    _Message += (_NumberOfMistakes); 
    _Message += (">");
    _Message += FPSTR(Msg_OK[_NumberOfArray]);
    _Message += ("</"); 
    _Message += (_NumberOfMistakes); 
    _Message += ("_Message>");

  return _Message;
}

void Parse_Msg(uint8_t Msg) {
  String Message = "";

  switch (Msg) {
    case 1:
      NumberOfMistakes += 1;
      Message = Macros (NumberOfMistakes, 0);  
      break;
    case 2:
      NumberOfMistakes += 1;
      Message = Macros (NumberOfMistakes, 1);
      break;
    //default:
    //Serial.println("СООБЩЕНИЙ НЕТ");
}

Сделайте, пожалуйста, полный пример, который можно было бы без танцев с бубнами запустить и посмотреть как там и что.

Код - больше 20 тысяч строк. Это та, часть, на которой я споткнулся.

Вот решение:,
Вместо
_Message += FPSTR(Msg_OK[_NumberOfArray]);
нужно
_Message += FPSTR(pgm_read_word(Msg_OK + _NumberOfArray));

Проблема с циклами (AVR)

Если у вас и массив с указателями на строки во flash, то при чем тут циклы Avr ???

Напишите специально маленький (минимально-возможный) пример, который бы демонстрировал проблему. И так надо делать всегда, чтобы нормально задать вопрос на форуме.

Вот как раз недавно была подобная тема - проблем “с циклами AVR” не бывает (вернее, бывают, но настолько редко, что этим можно пренебречь) проблема - она всегда “с головой программиста”.

1 лайк

А можно узнать имя контроллера в который собирается ваш код из 20к строк?

Где тут хоть один цыкл? ))

Так потому и 20 тыс, что с циклами АВР еще не разобрался :slight_smile:
Когда разберется - выяснится что 20 тыс строк можно переписать в 200 :slight_smile:

1 лайк