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

itehno

✩✩✩✩✩✩✩
3 Мар 2023
4
1
Добрый день.

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

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>)

C++:
#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("СООБЩЕНИЙ НЕТ");
}
 

Alex_HF

★✩✩✩✩✩✩
11 Мар 2023
40
16
Смотрите ссылку @PiratFox -> раздел Проблема с циклами (AVR)

_Message += FPSTR(pgm_read_word(Msg_OK + _NumberOfArray));
 
  • Лойс +1
Реакции: itehno

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
134
@itehno,
Из приведенного куска кода не понятно, как вы вызываете функцию и как вы проверяете результат работы. Приведите полностью короткий скетч с вашей проблемой.