EEPROM чтение и запись unsigned long
- Войдите на сайт для отправки комментариев
Ср, 18/11/2015 - 15:53
Помогите разобратся с кодом, что то я напутал.
Написл функции чтения и записи 4х байтовой переменной unsigned long Значения 9600 передаётся нормально значение 115200 непойми что 4294951424
#include <EEPROM.h>
//*****************************************************
unsigned long q = 115200;
unsigned long w=0;
//*****************************************************
void EEPROM_write_unsigned_long(uint8_t i, unsigned long data);
int EEPROM_read_unsigned_long(uint8_t i);
//*****************************************************
void setup()
{
Serial.begin(9600);
EEPROM_write_unsigned_long(0, q); // пишим в EEPROM 4 байта
w = EEPROM_read_unsigned_long(0); // читаем из EEPROM 4 байта
Serial.print(w);
}
//****************************************************************
void EEPROM_write_unsigned_long(uint8_t i, unsigned long data)// Для записи 4х байтовго значения пишим номер ячейки первого байта
{ // и переменную которую нужно сохранить далее функция разобёт переменную типа unsigned_long на 4 ячейки по одному байту и сохранит их.
EEPROM.write(i, data & 0xFF);
EEPROM.write(i+1, (data & 0xFF00) >> 8);
EEPROM.write(i+2, (data & 0xFF0000) >> 16);
EEPROM.write(i+3, (data & 0xFF000000) >> 24);
}
//*****************************************************************
int EEPROM_read_unsigned_long(uint8_t i)// Для чтения 4х байтовго значения пишим номер ячейки первого байта
{ // далее функция прочитает 4 ячейки по одному байту и соберет их в одну переменную типа unsigned long.
unsigned long data = 0;
byte val = EEPROM.read(i+3);
data = (data << 8) | val;
val = EEPROM.read(i+2);
data = (data << 8) | val;
val = EEPROM.read(i+1);
data = (data << 8) | val;
val = EEPROM.read(i);
data = (data << 8) | val;
return data;
}
//*****************************************************************
void loop()
{
}
//*****************************************************************
скорее всего не успевает собрать 4 байта, попробуйте библиотеку EEPROM2
спасибо обошолся стандартной библиотекой применил такое решение встретил на форуме
#include <EEPROM.h> //***************************************************** unsigned long q = 115200; unsigned long w=0; unsigned long EEPROM_ulong_read(int addr); void EEPROM_ulong_write(int addr, unsigned long data); //***************************************************** void setup() { Serial.begin(9600); EEPROM_ulong_write(0, q); // запись в EEPROM 4 байта unsigned long w = EEPROM_ulong_read(0); // чтение из EEPROM 4 байта unsigned long Serial.print(w); // Выводим результат в порт } //***************************************************************** unsigned long EEPROM_ulong_read(int addr) // чтение из EEPROM 4 байта unsigned long { byte raw[4]; for(byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr+i); unsigned long &data = (unsigned long&)raw; return data; } //***************************************************************** void EEPROM_ulong_write(int addr, unsigned long data) // запись в EEPROM 4 байта unsigned long { byte raw[4]; (unsigned long&)raw = data; for(byte i = 0; i < 4; i++) EEPROM.write(addr+i, raw[i]); } //***************************************************************** void loop() { } //*****************************************************************А почему не воспользоваться EEPROM.put() и EEPROM.get() ? Там вообще никаких проблем - можно просто long передавать и не париться.
не в курсе данного варианта пример можно
не в курсе данного варианта пример можно
https://www.arduino.cc/en/Tutorial/EEPROMGet - пример, где get'ом читают float'ы, а потом и структуру из 15 байтов одним вызовом функции.
https://www.arduino.cc/en/Tutorial/EEPROMPut - тот же пример, но не читают, а пишут.
спасибо попробую
у вас функция read возвращает int.
а конкретней с цитатой где и что возвращяет и что должна а то я чтото неувидел.
intEEPROM_read_unsigned_long(uint8_t i)сравните с кодом из второго вашего поста.ну если из второго то вот
unsigned long EEPROM_ulong_read(int addr) // чтение из EEPROM 4 байта unsigned long { byte raw[4]; for(byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr+i); unsigned long &data = (unsigned long&)raw; return data; }если из первого
то вот
int EEPROM_read_unsigned_long(uint8_t i)// Для чтения 4х байтовго значения пишим номер ячейки первого байта { // далее функция прочитает 4 ячейки по одному байту и соберет их в одну переменную типа unsigned long. unsigned long data = 0; byte val = EEPROM.read(i+3); data = (data << 8) | val; val = EEPROM.read(i+2); data = (data << 8) | val; val = EEPROM.read(i+1); data = (data << 8) | val; val = EEPROM.read(i); data = (data << 8) | val; return data; }Я тут вижу что переменная
это и есть определение возвращаемого значения. это не я так сичтаю, это так и есть на самом деле, никакая это не переменная адреса, такого понятия не существует.
непонял возвращяем то
unsignedlongdata; а в функцииintEEPROM_read_unsigned_long(uint8_t i)uint8_t i адрес ячейки или же вы говорите что функция обявлена как int а должна быть обявлена какunsigned longИменно это он и говорит уже полдня. Слово int перед функцией означает, что результатом работы функции является велична типа int. Вам это надо? Чтобы результат был int? Ну, тогда оставляйте как есть.
Кто Вам сказал, что Вы возвращаете unsigned long data? Глупости это всё. Функция возвращает в точности тот тип, который записан перед её именем в описании. А то что Вы пихаете в int'овый результат свою long'овую data, так это не страшно - она будет спокойненько обкорнана до int и возвращена.
почитайте как объявляются и работает функции.
оператор return возвращает значение размерносью заданой в определении функции, и не важно как переменная была объявлена внутри функции. по остальному всё верно.
Спасибо за разяснение незнал искал сам где почитать про return что он возвращяет из функции и как но подробно ненашол все както сжато теперь буду знать.
Спасибо за разяснение незнал искал сам где почитать про return что он возвращяет из функции и как но подробно ненашол все както сжато теперь буду знать.
Давайте так, вот Вам книга - people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf Прочитайте всю и разберите все примеры (запустите, поэкпериментируйте). И только после этого пытайтесь что-то программировать. Сразу же почувствуете разницу!
за книгу спасибо почитаю
CyberLib работала..... http://istarik.ru/blog/arduino/1.html
или гляньте новую от Arhat109 http://cyber-place.ru/member.php?u=5117
А почему не воспользоваться EEPROM.put() и EEPROM.get() ? Там вообще никаких проблем - можно просто long передавать и не париться.
Подскажите в чем проблема?
eeprom_write:18: error: 'class EEPROMClass' has no member named 'put'
код
Проблема, наверное, в доисторической версии библиотеки. У меня Ваш пример нормально компилируется. Библиотека у меня ниоткуда не скачанная - стала вместе с IDE и я ничего в ней не менял. IDE у меня 1.6.5.
Вот описание функций put и get на официальном сайте Arduino (насколько в Arduino вообще что-то может быть официальным)
https://www.arduino.cc/en/Tutorial/EEPROMPut
https://www.arduino.cc/en/Tutorial/EEPROMGet
Проблема, наверное, в доисторической версии библиотеки. У меня Ваш пример нормально компилируется. Библиотека у меня ниоткуда не скачанная - стала вместе с IDE и я ничего в ней не менял. IDE у меня 1.6.5.
Спасибо! помогло. Вроде и года не прошло как ставил, а уже устарела.