проблемма с EEPROM или я туплю....

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Здравствуйте, подскажите что не так?


#include <EEPROM.h>

String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.

char data;//Содержит символ полученый от сим модуля.


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
}

void loop() {
  while (Serial.available() > 0)
  {
    data = Serial.read();
    // Serial.println(data);
    if (data == '-')
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 0; i < 12; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
      Serial.println(nomber_Phone);
      return;
    }
  }
  if (data == '+')
  {
    for (byte i = 0; i < 12; i++)
    {
      EEPROM.write(i, data);
      currStr += data;
      data = Serial.read();
    }
    Serial.println("complete");
   return;
  }
}

имеем вот такой скетч, учусь записывать в EEPROM, так вот вроде запись проходит все хорошо но когда пытаюсь прочитать сдвигает символы... записываю номер +70123456789 пишет что записал complete

а когда отправляю "-" что бы прочитать из епрома, в ответ вот такое "+⸮7012345678"
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

если я правильно понял код,

строки цикла должны 34...44 должны быть внутри while т.е. вставить после 32 строки

в типе String  кажеться персым байтом идет длина строки, вот она то наверное и записывается в eeprom и я вляется не печатным символом

переходите полностью на char

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

d13lider пишет:

проблемма с EEPROM или я туплю....

Второе. Даже в двух местах.

1. В строке 40 Вы читаете всё подряд и потом пишете. Так вот, Ваш первый символ, это возврат каретки, оставшийся от команды "+". Вам надо там поставить проверку и то, что не является цифрой - игнорировать. Проще всего проверка делается так

if (isdigit(data)) { // Если в data сидит цифра

2. В той же строке 40 Вы читаете не проверяя, а пришло ли что-нибудь. Рискуете начать читать, когда оно ещё не успело прийти. Тоже проверять надо.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

разобрался) еепром надо было задержку поставить 


#include <EEPROM.h>

String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.

char data;//Содержит символ полученый от сим модуля.


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
}

void loop() {
  while (Serial.available() > 0)
  {
    data = Serial.read();
    // Serial.println(data);
    if (data == '-')
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 0; i < 12; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
       Serial.println(nomber_Phone);
      
     
      return;
    }
  
  else if (data == '+')
  {
    for (byte i = 0; i < 12; i++)
    {
      EEPROM.write(i, data);
      delay(4);
      currStr += data;
      data = Serial.read();
    }
    Serial.println("complete");
   return;
  }
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

d13lider пишет:

разобрался) еепром надо было задержку поставить 

Это не "разобрался",  это вы продолжаете тупить. Задержка - костыль чистой воды. Чуть что поменяете - опять перестанет работать. Перечитайте. что написал Евгений, неужели это так сложно понять?

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

b707 пишет:

d13lider пишет:

разобрался) еепром надо было задержку поставить 

Это не "разобрался",  это вы продолжаете тупить. Задержка - костыль чистой воды. Чуть что поменяете - опять перестанет работать. Перечитайте. что написал Евгений, неужели это так сложно понять?

 

прошу прощения, на момент когда писал, сообщений небыло... 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ЕвгенийП пишет:

d13lider пишет:

проблемма с EEPROM или я туплю....

Второе. Даже в двух местах.

1. В строке 40 Вы читаете всё подряд и потом пишете. Так вот, Ваш первый символ, это возврат каретки, оставшийся от команды "+". Вам надо там поставить проверку и то, что не является цифрой - игнорировать. Проще всего проверка делается так

if (isdigit(data)) { // Если в data сидит цифра

2. В той же строке 40 Вы читаете не проверяя, а пришло ли что-нибудь. Рискуете начать читать, когда оно ещё не успело прийти. Тоже проверять надо.

добавил- что то не выходит запись... 


#include <EEPROM.h>

String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.
String val = "";
char data;//Содержит символ полученый от сим модуля.
byte flag3=0;
byte flag1=0;
byte flag2=0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
}

void loop() {
  while (Serial.available() > 0)
  {
    data = Serial.read();
    delay(5);
    val += data;
    Serial.println(val);
    if (val=="write1")
    {
      flag1=1;
    }
   /*  if (val=="write2")
    {
      flag2=1;
    }
    if (val=="write3")
    {
      flag3=1;
    }*/
    if (val == "read1")
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 0; i < 12; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
      Serial.println(nomber_Phone);
      nomber_Phone = "";
      return;
    }
   /*else if (val == "read2")
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 13; i < 25; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
      Serial.println(nomber_Phone);
      nomber_Phone = "";
      return;
    }
    else if (val == "read3")
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 26; i < 38; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
      Serial.println(nomber_Phone);
      nomber_Phone = "";
      return;
    }*/
    else if ((flag1==1)&&(data == '+'))
    {
      Serial.println("OK");
      for (byte i = 0; i < 12; i++)
      {
        // Serial.println(data);
        EEPROM.write(i, data);
       
        currStr += data;
       if (isdigit(data))  {
        data = Serial.read();
       }
      }
      Serial.println("complete");
      flag1=0;
      return;
   
  }
 /* else if ((flag2==1)&&(data == '+'))
    {
      Serial.println("OK");
      for (byte i = 13; i < 25; i++)
      {
        // Serial.println(data);
        EEPROM.write(i, data);
        delay(4);
        currStr += data;
        data = Serial.read();
      }
      Serial.println("complete");
      flag2=0;
      return;
   
  }
  else if ((flag3==1)&&(data == '+'))
    {
      Serial.println("OK");
      for (byte i = 26; i < 38; i++)
      {
        // Serial.println(data);
        EEPROM.write(i, data);
        delay(4);
        currStr += data;
        data = Serial.read();
      }
      Serial.println("complete");
      flag2=0;
      return;
   
  }*/

}
val="";
data="";
}

пока игрался, изменил код... 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

щас ввожу так: write1 +70123456789 

если в коде оставляю все как есть 

 else if ((flag1==1)&&(data == '+'))
    {
      Serial.println("OK");
      for (byte i = 0; i < 12; i++)
      {
        // Serial.println(data);
        EEPROM.write(i, data);
       
        currStr += data;
       
        data = Serial.read();
     
      }
      Serial.println("complete");
      flag1=0;
      return;
   
  }

то все работает прекрассно

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015
#include <EEPROM.h>

String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.
String val = "";
char data;//Содержит символ полученый от сим модуля.

byte flag1=0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
}

void loop() {
  while (Serial.available() > 0)
  {
    data = Serial.read();
    delay(5);
    val += data;
    Serial.println(val);
    if (val.indexOf ("write1")> -1)
    {
      flag1=1;
    }
   
    if (val.indexOf ("read1")> -1)
    {
      if  (nomber_Phone != 0)
      {
        nomber_Phone = "";
      }
      for (byte i = 0; i < 12; i++) //Чтение Разрешонного номера из EEPROM
      {
        data = EEPROM.read(i);
        nomber_Phone += data;
      }
      Serial.println(nomber_Phone);
      nomber_Phone = "";
      return;
    }
 
    else if ((flag1==1)&&(data == '+'))
    {
      Serial.println("OK");
      for (byte i = 0; i < 12; i++)
      {
        // Serial.println(data);
        EEPROM.write(i, data);
       
        currStr += data;
       
        data = Serial.read();
     
      }
      Serial.println("complete");
      flag1=0;
      return;
   
  }

а если вот такой код, то вообще могу в порт любые крокозябры писать и все отлично работает 

adsfkjaskdjfh write1 as;lkdjfhlkajsd +70123456789 askdjghlaksdf
OK
complete
 
read1
+70123456789
 
вроде все стабильно работает