Со временем начинает игнорироваться delay

Привет. Не первый раз замечаю, что со временем работая моя arduino uno начинает тупо игнорировать паузы. Конкретно сейчас у меня запущен скрипт, который зажигает светодиод на 1 секунду, а затем гасит на 9 и проверяет что там прислал блютуз, и шлёт ему тоже самое в ответ. Скрипт залила вчера на плату, оставила включенным. И если вчера всё было четко, то сейчас светодиод мигает так, будто хочет у меня вызвать приступ эпилепсии.

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

Что происходит?

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX, TX

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

  Serial.println("Started");
  pinMode(8, OUTPUT);
}
void loop() {
  BtRead();

  digitalWrite(8, LOW);
  delay(9000);
  digitalWrite(8, HIGH);
  delay(1000);
}



void BtRead() {
  static char bt_command[64] = "";
  
  while (mySerial.available()) {
    char c = mySerial.read();
    
    if (c == '\r') continue;

    if (c != '\n' && c != '*') {
      int len = strlen(bt_command);
      bt_command[len + 1] = '\0';
      bt_command[len] = c;
    }
    else if (strlen(bt_command) > 0) {         
      mySerial.write("Command: ");
      mySerial.write(bt_command); 
      mySerial.write('\n');

      bt_command[0] = '\0';
    }
  }
}

А если перезагрузить ардуину, работать опять правильно начинает?

Именно)

Этот код легко может вызвать выход за границу массива, порчу памяти и далее может быть что угодно.
Никакого контроля размера сообщения от блютуз в нем не предусмотрено.

1 лайк

я это учту, спасибо. По поводу основной проблемы есть идеи?

почему вы думаете, что проблема не в этом?

хотя бы потому, что я с подобным встречаюсь не в первый раз. И в прошлые разы не было ни блютуза ни подобной работы с памятью.

Но, предположим, что дело именно в этом. Каков механизм влияние этого плохого кода на игнорирование delay?

удивительно. А я с таким не встречался НИКОГДА.

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

Если в прошлые разы у вас не было “подобной работы с памятью” - значит могли быть другие, настолько же грубые ошибки в коде.

ну я тоже считала, что такое в принципе не может быть. Но имеем что имеет. Мб плата неисправна, я не знаю. Увы, сейчас другой для тестов нет.

Ошибки, безусловно, могли быть, однако, на мой взгляд, вы меня переоцениваете, если верите в то, что я способна поменять поведение функции delay на таком уровне.

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

Подправила код. Нужны ли еще какие-то правки?

void BtRead() {
  static char bt_command[64] = "";
  
  while (mySerial.available()) {
    char c = mySerial.read();
    
    if (c == '\r') continue;

    if (c != '\n' && c != '*') {
      int len = strlen(bt_command);
      if (len + 1 == sizeof(bt_command))
        continue;

      bt_command[len + 1] = '\0';
      bt_command[len] = c;
    }
    else if (strlen(bt_command) > 0) {         
      mySerial.write("Command: ");
      mySerial.write(bt_command); 
      mySerial.write('\n');

      bt_command[0] = '\0';
    }
  }
}

А можно тут как-то редактировать сообщения? А то грустно смотреть на свои грамматические ошибки)

вроде нет

Скажите, а если запустить программу и вообще ничего ей не посылать - она назавтра тоже начнет мигать лампочкой?

Справа под сообщением три точки. Если их нажать - должен появится карандащик - это иконка редактирования.

у меня только урна появляется(

Ну завтра дам знать, мигает или нет

значит не доросли еще. Карандашик заслужить надо :slight_smile:

Когда программа ведет себя так, как нее может вести себя в принципе, это и является, как правило, признаком порчи содержимого памяти.

1 лайк

@olonach1995,

а в монитор порта Вы смотрели? Там “лишний раз” слово “Started” не появляется случайно?

1 лайк

кто-то заломал систему управления цветком видимо…
PS вывод millis() в монитор порта даст “информацию к размышлению”

1 лайк

Всем привет. Немного обратной связи.

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

Монитора нет, Started не посмотреть. Вся эта схема затевалась просто ради того, чтобы узнать насколько мне хватит старых аккумуляторов, ёмкости которых я не знаю. Блютуз и плата основные потребители, так что только их и подключила и написала простой скрипт. Кто знал, что там такое начнется.

Вывод millis() норм идея, спасибо. Буду выводить на блютуз

ждём’c