Официальный сайт компании Arduino по адресу arduino.cc
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
спасибо обошолся стандартной библиотекой применил такое решение встретил на форуме
А почему не воспользоваться EEPROM.put() и EEPROM.get() ? Там вообще никаких проблем - можно просто long передавать и не париться.
не в курсе данного варианта пример можно
не в курсе данного варианта пример можно
https://www.arduino.cc/en/Tutorial/EEPROMGet - пример, где get'ом читают float'ы, а потом и структуру из 15 байтов одним вызовом функции.
https://www.arduino.cc/en/Tutorial/EEPROMPut - тот же пример, но не читают, а пишут.
спасибо попробую
у вас функция read возвращает int.
а конкретней с цитатой где и что возвращяет и что должна а то я чтото неувидел.
int
EEPROM_read_unsigned_long(uint8_t i)
сравните с кодом из второго вашего поста.
ну если из второго то вот
если из первого
то вот
Я тут вижу что переменная
это и есть определение возвращаемого значения. это не я так сичтаю, это так и есть на самом деле, никакая это не переменная адреса, такого понятия не существует.
непонял возвращяем то
unsigned
long
data; а в функции
int
EEPROM_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.
Спасибо! помогло. Вроде и года не прошло как ставил, а уже устарела.