Хранение 13-значного числа
- Войдите на сайт для отправки комментариев
Ср, 05/02/2020 - 21:46
Здравствуйте. Модулем RDM6300 считываю пропуска.
Код такой:
#include <SoftwareSerial.h> SoftwareSerial RFIDSerial(7, 6); // RX, TX uint8_t input; String temp=""; void setup() { Serial.flush(); Serial.begin(19200); RFIDSerial.begin(9600); } void loop(){ if (RFIDSerial.available() > 0) { input = RFIDSerial.read(); temp+=input; if (temp.length()==13) { Serial.println(temp); temp=""; } } }//loop
Нужно организовать хранение 13 символов, количество пропусков будет около 100 штук.
Заранее вписать все пропуска возможности нет.
Подскажите как хранить информацию.
Подскажите как хранить информацию.
В EEPROM, например.
Подскажите как хранить информацию.
Перевести в тип uint64_t, а потом, как сказали выше - в ЕЕПРОМ
Сто пропусков займут 100 * 8 = 800 байт, а емкость ЕЕПРОМ обычной Уно-Нано - 1024, так что влезет
Теперь, собственно, два вопроса, как перевести строку String в uint64_t?
uint64_t занимает 8 байт.
Не особо понимаю как осуществить запись более 1 байта в ячейку в EEPROM
Теперь, собственно, два вопроса, как перевести строку String в uint64_t?
скорее всего, придется писать свою функцию, библиотечные не умеют работать с uint64_t
Не особо понимаю как осуществить запись более 1 байта в ячейку в EEPROM
Никак. В одну ячейку ЕЕПРОМ пишется 1 байт, соответвенно каждый uint64_t займет 8 ячеек.
Никак. В одну ячейку ЕЕПРОМ пишется 1 байт, соответвенно каждый uint64_t займет 8 ячеек.
А как разбить uint64_t на 8 ячеек (байт) ?
А как разбить uint64_t на 8 ячеек (байт) ?
изучайте и делайте по аналогии
http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int
А как разбить uint64_t на 8 ячеек (байт) ?
Пишете: делите по степеням двойки и заносите в восемь ячеек, читаете: по восемь ячеек на число и возводите в степени.
bwn, делить и возводить - это дорого. Старый добрый union jack решает проблему дёшево и сердито.
А как разбить uint64_t на 8 ячеек (байт) ?
Пишете: делите по степеням двойки и заносите в восемь ячеек, читаете: по восемь ячеек на число и возводите в степени.
Так мне более понятно.
1024 байт, по 8 байт на каждый пропуск, итого 1024/8=128 пропусков.
Хотел брать из стринга по два символа переводить в число и записывать....чувствется что это чушь.
Как делить по степеням, не понял.
Старый добрый union jack решает проблему дёшево и сердито.
Не ругайси, что есть бритишь флаг, растолмачь, я нихрена не математик.(((
Старый добрый union jack решает проблему дёшево и сердито.
Не ругайси, что есть бритишь флаг, растолмачь, я нихрена не математик.(((
Прошу разъяснить что значит EEPROM.put(passNo * sizeof(passCode), passCode);
для чего умножаем 22 на 8
Положим, что passNo - порядковый номер пароля/идентификатора/etc.
Надеюсь, что у вас не было плана сгружать все 100 пропусков в одни и те же 8 ячеек?
Я записал своё число в ячейки начиная с адреса 0, соответственно следующий свободный адрес будет 8, всё верно.
Как мне назад получить своё число?
Надеюсь, что у вас не было плана сгружать все 100 пропусков в одни и те же 8 ячеек?
Нет нет, общий смысл я понял, что моё число это 8 байт, соответственно 8 ячеек памяти из 1024
https://www.arduino.cc/en/Reference/EEPROMGet
Ругается на Serial.println(chislo);
Как я понимаю, Serial.println не поддерживает вывод uint64_t ?
Пока не поддерживает, увы.
Что-то не понимаю.
Записал число uint64_t CodKartu = 1234567890123;//13 символов
Потом в скетче меняю uint64_t CodKartu = 2224567890123;//13 символов
и не записываю
А условие всё равно выдает Ок, хоть числа и не равны
Монитор порта:
Неправильно используется EEPROM.get()
См. пример в справочнике внимательней. Можете потренироваться на uint32_t, а потом заменить его на uint64_t
----
get()
Parameters
address: the location to read from, starting from 0 (int)
data: the data to read, can be a primitive type (eg. float) or a custom struct
Returns
A reference to the data passed in
-----------
Спасибо. Ошибку понял.
Теперь надо разобраться с String to uint64_t
Перепиши под 64-битную переменную и пользуйся на здоровье.
bwn, делить и возводить - это дорого. Старый добрый union jack решает проблему дёшево и сердито.
Та нифига не дорого. Если с юнионом тяжко, можно сдвигать и складывать.)
bwn, делить и возводить - это дорого.
Спасибо
Помогите разобраться.
После считывания пропуска происходит запись в EEPROM.
Но после считывания кода пропуска ардуина нано перезагружается.
Иногда успевает записаться код пропуска, но не корректно.
Сижу, рыдаю над этим
042
void
EEPROM_String_write(uint16_t addr, String num){
043
byte
raw[8];
044
(String&)raw = num;
045
for
(uint8_t i = 0; i < 8; i++){
046
EEPROM.write(addr+i, raw[i]);
047
delay(10);
048
}
049
}
Watchdog ресетит или что-то другое?
Что вторая строчка должна значить?
Для начала отключить вачдог.
Отключив вачдог ардуина зависает.
Код я взял из образца выше, #25 пост (в нём не разобрался)
Код я взял из образца выше, #25 пост (в нём не разобрался)
так разберись сначала. Ты код перекорежил, не разбираясь - вот все и зависло. И так будет на каждой строчке, пока не начнешь учебники читать.
Было бы всё просто, не понимаю я что за & и для чего, не понимаю как стринг побайтно хранить.
Не храни стринг побайтно, храни byte[].
не понимаю как стринг побайтно хранить.
так ты сам себе проблемы создаешь. Вот ты в своем коде сначала читаешь код пропуска посимвольно (строка 82), потом запихиваешь его в стринг - а потом сам не знаешь, как его оттуда достать. Может тогда не надо String испольовать7
Записывается, читается.
Код пропуска занимает 6 байт.
Всё ли верно?
Отключив вачдог ардуина зависает.
Код я взял из образца выше, #25 пост (в нём не разобрался)
Так потому и перезагружается, что зависла.
Ищи теперь в каком месте виснет.
Персональных Serial.print'ов навтыкай после каждой строки.
Поймёшь в каком месте виснет
Ничего не понимаю
Добавил символов.
"читается корректно"? -уверен?
Ты в своем коде записываешь в ЕЕПРОМ не саму строку, а только ее адрес.
Чтоб проверить - запиши длинную строку в ЕЕПРОМ, выключи ардуину, подожди минут пять, чтоб все кондеры в БП разрядились - потом включи обратно и попробуй прочитать строку обратно в другую переменную.
короче, замаялся править предыдущее сообщение, никак не могу придумать метод проверки правильности чтения и записи в ЕЕПРОМ.
Как я уже писал, ты пишешь в ЕЕПРОМ не саму строку, а ее адрес в памяти. Когда у тебя статичные строки, заданные прямо в коде - их адрес не меняется и при такой "записи в ЕЕПРОМ" у тебя будет иллюзия, что все пишется и читается правильно.
Попробуй написать код, где строка вводится из Сериал - например с твоего считывателя. Потом запиши ее в ЕЕПРОМ. выключи ардуину, подожди... и потом попробуй прочитать строку обратно. Вот тут ты сразу убедишься. что в ЕЕПРОМ-то ничего и нет!
Тогда я не понимаю, как работает put()
Тебеговорили уже, что код ключей прекрасно укладывается в uint64_t. Пошто ты так не пишешь? Нахрена строки то приплетать?
Тогда я не понимаю, как работает put()
нет, ты не понимаешь, как устроен String. Это ссылочный тип, к нему EEPROM.put() get() напрямую неприменимы.
Впрочем, это повод задуматься над тем, о чем тебе написали несколько человек - о том что String в твоей программе только мешает.
Верно?
не понимаю как стринг побайтно хранить.
так ты сам себе проблемы создаешь. Вот ты в своем коде сначала читаешь код пропуска посимвольно (строка 82), потом запихиваешь его в стринг - а потом сам не знаешь, как его оттуда достать. Может тогда не надо String испольовать7
081
if
(RFIDSerial.available()>0 && FlagReads) {
082
input = RFIDSerial.read();
083
temp+=input;
084
if
(temp.length()==26) {
085
String kods=temp.substring(13, 26);
Скажите, как мне сделать, чтобы можно было сравнивать с uint_64? хранимой в еепром
При считывании я получаю 26 символов, из которых полезные только 13 последних.
Скажите, как мне сделать, чтобы можно было сравнивать с uint_64?
написать свою собственную функцию конверсии строки в число, вот образец (не ардуино)
только обрати внимание, что здесь строка - вовсе не String, а символьный массив
И тут я совсем ничего не понял...