Код работает только с Serial.println () в нем

У меня есть цикл, который проходит через мои датчики (элементы), а затем отправляет их состояние через MQTT. Я запускаю этот код на платах разработчиков ESP8266, и на некоторых из них этот код работает, тогда как на других он выдает исключение через случайное время.

Теперь, пытаясь отладить это, я обнаружил, что, если я раскомментирую Serial.println() в строке, как показано ниже (это должно быть именно это место, помещая его в любую другую строку, это не помогает), код работает совершенно стабильно. несколько дней. Но как только я удаляю этот println, он начинает вылетать примерно через 100 секунд. Что здесь происходит? Что делает Serial.println(), что делает мой код стабильным?

void _loop(String priority)
{
    for(std::vector<IItem*>::iterator it = items.begin(); it != items.end(); ++it) 
    {
        if ((*it)->loopPriority == priority)
        {
            (*it)->loop();
            for (std::map<String, String>::iterator pubChannel = (*it)->pubChannels.begin(); pubChannel != (*it)->pubChannels.end(); pubChannel++ )
            {
                //Serial.println(pubChannel->second);
                mqtt.sendMsg(pubChannel->second, (*it)->command(pubChannel->first));
            }
        }
    }
}

Serial.println () тратит время на отправку данных по последовательному каналу. Попробуйте заменить его на сон.

Erki Aring 07.06.2018 23:09

Я уже сделал. Это не то. Спящий режим по-прежнему вызывает исключения, в отличие от println. Я даже увеличивал количество сна на 100 мс с каждой итерацией, но все же было исключение.

ojek 07.06.2018 23:51

Поскольку мы ловим загадочную ошибку, _loop, вероятно, является незаконным идентификатором. Все, что начинается с подчеркивания в глобальном пространстве имен, зарезервировано для использования реализацией библиотеки. Подробнее об этом читайте в Каковы правила использования символа подчеркивания в идентификаторе C++?.

user4581301 08.06.2018 01:13

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

Delta_G 08.06.2018 04:45

Спасибо, вот мой код, без ссылки, так как я не думал, что кто-то захочет прочитать эту кучу кода;) github.com/ojek/OpenHabHomeAutomation/blob/master/arduino/…

ojek 08.06.2018 19:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
67
0

Другие вопросы по теме