EEPROM - что не так с записью

nprizrak
Offline
Зарегистрирован: 27.09.2015

Arduino Nano 328

Простой код -читаем с ком порта и пытаемся записать в EEPROM

#include <Arduino.h>
#include <EEPROM.h>

String cmd="";

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

void loop() {
  while(Serial.available()){
    char c=Serial.read();        
        delay(100);
        if(c!='\r' && c!='\n') //если не конец строки, то читаем дальше
        {
          Serial.print(c); //эхо
          cmd=cmd+c; 
          continue;
        }        
        cmd.trim();
        cmd.toLowerCase();
        if(cmd.length()==0) continue;
        //обрабатываем команду
        int pos=cmd.indexOf(" ");
        if(pos>0)
        {
          uint16_t addr=cmd.substring(0,pos).toInt();
          if(cmd.substring(pos+1).indexOf(".")>0)
          {
            double val=cmd.substring(pos+1).toDouble();
            EEPROM.put(addr,val);
          }
          else
          {
            uint8_t val=cmd.substring(pos+1).toInt();
            EEPROM.update(addr,val);
          }
          
        }
        else 
        {
          Serial.println(cmd);
        }
        //Serial.println();
        cmd="";
    }
    delay(100);
}

Непонятный момент: при таком коде, после любой команды на запись ( например 100 100) - аппарат зависает и не реагирует.

Но если раскомментировать строку //Serial.println();, то все работает нормально, как положено.

Возможно, это известно и описано, но почему это так?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А ты вместо Serial.println() попробовай delay(4) поставить

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

Я дико извиняюсь, что влез в чужую тему у меня тоже вопрос по еепрому 

#include <EEPROM.h>

int oxrana ;                            // Переменные для записи данных
int eeAddress = 0;    

// условие проверяем каждые 10 сек------------------

 oxrana = EEPROM.read(eeAddress);       //  каждые 10 сек читаем данные из еепром
  if (oxrana == 1) {                    // если прочитана "1" то считаем охрану активной 
    Secury = true;
  }
  else {
    Secury = false;
  }
//--------------------------------------------------------------------
  else if (at.indexOf("S/Alarm", 4) > -1) {       // если получена команда постановки на охрану
    if (VoltRead() < Vstart) {
      detachInterrupt(0);                        
      delay(50);
      oxrana = 1;
      EEPROM.update(eeAddress, oxrana);      // то записываем "1" в память 
      attachInterrupt(1, callback, LOW);                // 
      attachInterrupt(0, hitback, LOW);
      gethit = false;
      Secury = true;
     // Serial.println ("OK");
    }
   }
---------------
 else if (at.indexOf("S/Calm", 4) > -1) {           // если получена команда снятия с охраны 
    void Silence ();
  }
---------------
 void Silence(){
    detachInterrupt(1);                         // отключаем прерывания
    detachInterrupt(0);                         // 
    oxrana = 0;
    EEPROM.update (eeAddress, oxrana);          // то записываем "0" в память

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

__Alexander
Offline
Зарегистрирован: 24.10.2012

 void Silence ();

вызывать функцию надо без void

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

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