Извлечение данных из PROGMEM.
- Войдите на сайт для отправки комментариев
Здравствуйте.
Пытаюсь написать скетч простейшего устройства контроля доступа выполненного на плате Arduino Uno и считывателе RDM6300.
В сети есть готовые скетчи, но т.к. метки у меня не перезаписываемые и их порядка 100 штук вида:
"25049484852546652515269553"
"25049484852557049576648673"
"25049484852555467704870653"
Приходится переделывать доступные скетчи под свои потребности.
Суть проблемы состоит в том что 100 меток приведенного размера просто не влезают в RAM память, для чего на форуме мне посоветовали обрезать инвариативную часть меток и запихать их в PROGMEM. С этой задачей справился довольно легко :
const uint64_t PROGMEM Str[] = { 65253555453653 , 46654545166503 , 64853535451653 };
#include <SoftwareSerial.h> #include <avr/pgmspace.h> // Подключаем сам ридер SoftwareSerial RfidReader(8, 9); String s; String data1; bool ok = false; bool reads = false; // активируемый порт при считывании валидной карты int yes = 6; // активируемый порт при считывании карты не из списка int no = 7; // Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь const uint64_t PROGMEM Str[] = { 65253555453653 , 46654545166503 , 64853535451653 }; char newtag[] = {"00000000000000000000000000"}; void setup(){ RfidReader.begin(9600); Serial.begin(9600); pinMode(yes, OUTPUT); pinMode(no, OUTPUT); } // данная функция сравнивает по очереди все 14 символов // массива из базового массива, и только что считанного массива void loop(){ char buffer[1]; //reads = ok = false; // если карта поднесена if (RfidReader.available() > 0) { // создаем массив с данными поднесенной карты for (int x = 0 ; x < 14 ; x++){ data1 = RfidReader.read(); s+=data1; while (RfidReader.available()) break; } if (s.length()==26) { // выводим данные Serial.println("yes"); strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[0]))); Serial.println(buffer); /* Код проверки валидности карт пока отключил while (RfidReader.read() > 0) {}; for (int i = 0 ; i < 1 ; i++){ strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[10]))); Serial.println(buffer); if (s==buffer){ digitalWrite(yes, HIGH); delay(4000); digitalWrite(yes, LOW); s=""; } }*/ } else { Serial.println(s); s=""; } } }
По всей видимости проблема заключается в определении типа считываемых данных. По идее они должны извлекаться так же как и вносились(хотя могу и ошибаться) в виде uint64_t, но как это прописать в моем варианте – ума не приложу.
А вот с извлечением из PROGMEM никак не могу разобраться. То что накопал в сети на данный момент не работает:
char buffer[];
strcpy_P(buffer, (PGM_P)pgm_read_word(&(Str[])));
Serial.println(buffer);
Как же он будет работать, если ваш массив uint64_t, а пример для строк?
croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?
В какой степени Ардуино поддерживает uint64-t, я не знаю (и разбираться мне лично неинтересно), но коль скоро на выходе нужна строка, а не число, я повторю рекомендацию: вместо десятичного использовать двоично-десятичное представление, т.е. вместо
писать
а в процессе работы читать побайтно и сразу считанный байт преобразовывать в два симворла строки, т. 0x65 - в "65", 0x25 - в "25" и т.д. Должно получиться быстре и компактнее (только строку придетя заполнять с конца, т.к. в Ардуино числа хранятся, начиная с младшего байта).
croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?
Да он вообще не число считывает, а пытается копировать некую строку, которая лежит по адресу, определяемому первыми двумя байтами элемента (элементов) его uint64_t массива. Я даже не знаю, к чему это может привести. Разве что к двойному зависанию.
Да он вообще не число считывает, а пытается копировать некую строку, которая лежит по адресу, определяемому первыми двумя байтами элемента (элементов) его uint64_t массива. Я даже не знаю, к чему это может привести. Разве что к двойному зависанию.
Посмотрел внимательнее.
Т.к. число 14-значное, старший байт наверняка нулевой. Так что копировать функцией для С-строки как раз можно. (по крайней мере, в этом месте зависания не будет) Только, конечно, надо сначала обнулить буфер числа, а потом работать с ним как с числом, а не как со строкой.
Профессиональный юмор.
Это созданная пользователем ситуация, в которой не помогает не только штатный reset, но и все обычные действия, которые предпринимает обслуживающий персонал. Причем сам пользователь не может объяснить как он этого добился, но легко повторяет это через какое-то время.
Ну вот, к примеру, когда некто кормит atol() массивами, а потом у него ардуина шиться перестает. Или что-то в этом роде.
Как же он будет работать, если ваш массив uint64_t, а пример для строк?
так вот я и спрашивал как считывать uint64_t из PROGMEM )))
Байт считать можете? Ну и читайте его побайтно - восемь байтов.
croan, word - это два байта, а uint64-t - 8 байтов. Как же оно будет работать, если из восьми байтов Вы читаете только два?
В какой степени Ардуино поддерживает uint64-t, я не знаю (и разбираться мне лично неинтересно), но коль скоро на выходе нужна строка, а не число, я повторю рекомендацию: вместо десятичного использовать двоично-десятичное представление, т.е. вместо
писать
а в процессе работы читать побайтно и сразу считанный байт преобразовывать в два симворла строки, т. 0x65 - в "65", 0x25 - в "25" и т.д. Должно получиться быстре и компактнее (только строку придетя заполнять с конца, т.к. в Ардуино числа хранятся, начиная с младшего байта).
видимо придется использовать переделываемый вариант, т.к. он проще - там изначально номер метки разбивается по два числа. я думал что может быть есть наименее трудоемкий способ занесения 100 меток в базу(каждую метку надо делить на пары и разделять запятыми). да и интересен был процесс реализации этой задачи. но по всей видимости целиком число не получится использовать - нужны танцы с бубном)
в первозданном варианте(скетч прикреплен) как раз и был такой вариант. но без внесения в progmem
спасибо, пример хороший, но как раз от разделения запятыми я и пытался уйти) видимо никак))
Вот вариант, например:
Вот вариант, например:
немного не понятно это выражение, но спасибо, буду разбираться)
croan, вам в том топике предложили несколько вариантов решения. в том числе самый очевидный - просто положить ваши метки в PROGMEM в виде строк, без всяких преобразований. С вашими знаниями не стоит лезть в uint64_t или двоично-десятичное представление. В виде строк во флеше легко поместится даже не 100 меток. а раз в пять больше
сотню меток разделять запятыми ручками) хотел по-научному))
croan, вам в том топике предложили несколько вариантов решения. в том числе самый очевидный - просто положить ваши метки в PROGMEM в виде строк, без всяких преобразований. С вашими знаниями не стоит лезть в uint64_t или двоично-десятичное представление. В виде строк во флеше легко поместится даже не 100 меток. а раз в пять больше
положить-то я их вроде как положил в виде строк, а как вытянуть их оттуда - мне там так и не сказали. или я чего-то не понял. потому и создал отдельную тему. вытягивание строк из progmemа я вообще не смог найти.
сотню меток разделять запятыми ручками) хотел по-научному))
такаие вещи делаются не вручную, а отдельной программой.
сотню меток разделять запятыми ручками) хотел по-научному))
такаие вещи делаются не вручную, а отдельной программой.
про существование оной не знал)
про существование оной не знал)
Попал b707!!! Рассказывайте теперь где оную скачать или какое видео посмотреть.
На cpan.org, вестимо...
вытягивание строк из progmemа я вообще не смог найти.
плохо искали, даже в букваре Ардуино пример есть https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
см второй раздел - "Array of strings"
Попал b707!!! Рассказывайте теперь где оную скачать или какое видео посмотреть.
даже не подумаю (без смайла)
croan. я зря влез - вижу sadman в #14 вам уже готовый код предложил под uint64_t - пользуйтесь и не забивайте мозг
не забивайте мозг
Хренушки! Сегодня день такой - 11-ый лунный, вторая фаза, опять же Луна в созвездии Рака. В общем, "Луна стала Раком на Весы".
Вон соседняя тема такая же :(
вытягивание строк из progmemа я вообще не смог найти.
плохо искали, даже в букваре Ардуино пример есть https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
см второй раздел - "Array of strings"
вот как раз с оной и стянул
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer);
а для меня как для новичка не совсем понятно что там и откуда... ибо подробного описалова нет. дешифруете надпись (char*)pgm_read_word(&(string_table[i])) - буду очень вам благодарен)
блин, ребятыыыы... я прекрасно понимаю что у новичков бывают реально тупые вопросы из-за незнания предмета. и что некоторых эта "тупость" раздражает. но терпимее что ли надо быть. некоторые очевидные для вас вещи совершенно не очевидны для новичков. потому и создаются бесконечно бестолковые темы на форумах. и ничего с этим не поделать.
взять, к примеру, строку strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));
которая переводит данные из progmem в ram . для чего это строка - я понимаю, но расшифровки содержимого я так и не смог найти (по-крайней мере на понятном мне русском языке), а не понимая как оно устроено я не могу понять как его преобразовать в то что мне надо. поэтому и задаю здесь тупые вопросы)
Вас в школе учили разбирать предложение на подлежащее, сказуемое там... ?
Попробуйте применить тот же самый способ и разбить непонятную вам строку на части, да потом каждую обмозговать. Мы же тут не работаем преподавателями/репетиторами за зарплату от государства.
Были у меня свободное время и интерес к uint64_t - я поковырялся и кодом продемонстрировал как вытаскивается и сравнивается число. Полдня на объяснения я себе не могу позволить.
но расшифровки содержимого я так и не смог найти (по-крайней мере на понятном мне русском языке),
Нету там никакой расшифровки. Там используются самые общие понятия языка программирования, который все новички тщательно и скурпулёзно отказываются изучать на том основании, что в рекламе мол сказано, что Ардуино может пользоваться не программист, а любая домохозяйка, а потому нет нужды становиться программистами.
Если у Вас тот случай, то и пользуйтесь как "беременная доярка" - мигайте светодиодом, ставьте готовые скетчи из примеров и радуйтесь жизни, получайте удовольствие. Какой нахрен прогмем? Вы видели домохозяйку, которая слышала такое слова и точно уверена, что к минету это не имеет никакого отношения?
Если же хотите понимать что там написано и писать самому, то придётся становиться программистом. Вот Вам описание всего, что есть в этой строке на русском языке. Читайте. Изучайте.
#14 Скетч неплохой. Особенно если скрестить со структурами или классом. И да согласен. Объянять людям что и как это на пол дня тупой и бесполезной писанины. Все уже открыто до нас. И незачем жевать эту кашу снова.
сотню меток разделять запятыми ручками) хотел по-научному))
такаие вещи делаются не вручную, а отдельной программой.
про существование оной не знал)
Узнаете, когда напишете эту программу сами.
По моему опыту, при составлении более или менее серьезной программы для Ардуино, приходится писать в несколько раз больше кода для ПК. Программы для ПК, как правило, служат для подготовки массивор констант, которые затем будет использовать Ардуино в своей работе.
Вам предлагается написать простейшую программу по обработке текста - которая вставляет запятую после каждых двух цифр. Это совершенно обычная практика.
Вас в школе учили разбирать предложение на подлежащее, сказуемое там... ?
Как же, как же, как сейчас помню: девочка это подлежащее, мальчик надлежащее, а пошли в лес за грибами, это предлог.))))
bwn, хотя бы так. А то получается . Группа подростков поперлась в лес. Там набухались, кто кого драл неизвестно, и какая была оринтация до и после неизвестно. Кто будет отвечать за последствие тоже неизвестно. Что, то же открывать тему на соотвествующем форуме? :)
Что, то же открывать тему
А то!
на пол дня тролить новичков время находится, а объяснять - нет)))
нах вообще лезть в темы, в которых кроме стёба и глума ничего не пишете ?
я просто не могу вашей логики понять: залез чел на форум с вопросом, залез потому что не понимает предмета. вот пытается но не понимает. и, обращаю внимание, не просит готовый код а хочет сам разобраться. кто-то дельные советы дает(за что спасибо огромное), а кто-то через губу не переплюнет чтобы что-то полезное сказать, а только шлак всякий изрыгает. так вот, обращаюсь к таким умникам, которые знают, но не помогают - пшли вон из моей темы. создавайте свои и стебитесь там над кем хотите. я здесь по делу и у меня нет времени читать вашу скверну. кто помогает - еще раз огромное спасибо!
забываете вы , что тут не все занимаются программированием.
лично я поставил для себя задачу и пытаюсь ее реализовать. я пытаюсь понять как работает то что я буду использовать. для меня нет цели изучить программирование и сделать его целью своей жизни, я не собираюсь зарабатывать на этом. тогда нафига мне еще писать программу по разделению чисел запятыми, которая по сути никакого отношения не имеет к тому что я хочу понять ???
в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного.
в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного.
Верно. Но при этом вы садитесь в автомобиль, купленный у тех, кто понимает в процессах литья и штамповки.
В данном случае вы прибегаете на завод, говорите: "делаю свой автомобиль! Объясните, как подкидывать антрацит в топку! Времени изучать металловедение нет, хочу за руль!"
в, садясь за руль автомобиля, и зная как в экстренной ситуации поменять колесо врядли захотите изучать процесс литья или штамповки оного.
Верно. Но при этом вы садитесь в автомобиль, купленный у тех, кто понимает в процессах литья и штамповки.
В данном случае вы прибегаете на завод, говорите: "делаю свой автомобиль! Объясните, как подкидывать антрацит в топку! Времени изучать металловедение нет, хочу за руль!"
вижу это иначе) а именно - если мне интересно как работает двигатель - я могу попытаться понять это и , возможно, данное знание мне пригодится в эксплуатации автомобиля.но создавать предприятие по производству движков(эквивалентно предложению разработать программу по установке запятых) для понимания работы двигателя вовсе необязательно. так и со скетчем: мне интересно как он работает и я хочу его доработать под свои нужды (ну нет у меня в селе 95 бензина, а есть только газ) .
а изображать из себя гаражных умельцев которые пацанов с ведром заставляют искать компрессию - много ума не надо. ибо ума этого не видно, даже если он и есть.
вот так и здесь - дохрена пишем, дохрена умничаем, а объяснить пацану что такое компрессия - западло)
вот и бегаю я с ведром ищу эту компрессию.
разбираю строку по словам и гуглю каждое. посмотрим что из этого получится...
Я Вам в #31 дал ссылку, где всё написано, но Вы же не читатель. Вы приходите сюда и требуете, чтобы эту же книгу Вам кто-то прямо сюда перевколотил. Зачем? Читайте там.
P.S. Если Вы считаете, что для понимания что написано в программе, Вам не нужна вся книга - то ошибаетесь. Без базовых знаний Вы нихрена не поймёте, а там именно базовые знания.
Так что, если Вы и впрямь хотите что-то понять, то завязывайте хамить, берите книгу и не возвращайтесь пока всё не прочитаете и не разберёте все приведённые там примеры.
А то несетё тут какую-то ахинею ...
забываете вы , что тут не все занимаются программированием.
Все. Потому что без программирования сделать что-то на микроконтроллере невозможно. Если Вы хотите получить готовое изделие без программирования, то либо купите его, либо закажите работу программисту. По-другому не бывает.
Я Вам в #31 дал ссылку, где всё написано, но Вы же не читатель. Вы приходите сюда и требуете, чтобы эту же книгу Вам кто-то прямо сюда перевколотил. Зачем? Читайте там.
P.S. Если Вы считаете, что для понимания что написано в программе, Вам не нужна вся книга - то ошибаетесь. Без базовых знаний Вы нихрена не поймёте, а там именно базовые знания.
Так что, если Вы и впрямь хотите что-то понять, то завязывайте хамить, берите книгу и не возвращайтесь пока всё не прочитаете и не разберёте все приведённые там примеры.
А то несетё тут какую-то ахинею ...
забываете вы , что тут не все занимаются программированием.
Все. Потому что без программирования сделать что-то на микроконтроллере невозможно. Если Вы хотите получить готовое изделие без программирования, то либо купите его, либо закажите работу программисту. По-другому не бывает.
не хамлю я. бесят умники, которые на вопрос "что это значит" отвечают "иди в библиотеку"))
кстати ссылку в посте 31 я заметил после этого вашего сообщения ибо не дочитал до конца весь пост, т.к. домохозяйки,минет показались мне не очень близкими к обсуждаемой теме))) а оказывается надо было дочитать, ведь где-то между домохозяйкой и минетом таился ответ на вопрос - "иди в библиотеку")))
но все равно спасибо. почитаемс...
Если же хотите понимать что там написано и писать самому, то придётся становиться программистом. Вот Вам описание всего, что есть в этой строке на русском языке. Читайте. Изучайте.
Евгений, между вторым и четвертым изданием есть глобальная разница, не в курсе? Сподвигли меня жабу прихлопнуть, а вот разница в цене между ними аж пятьсот рупий, хотя формат и страниц почти одинаково.
Евгений, между вторым и четвертым изданием есть глобальная разница, не в курсе? Сподвигли меня жабу прихлопнуть, а вот разница в цене между ними аж пятьсот рупий, хотя формат и страниц почти одинаково.
Вес проверяли? Грибы придавливать ежели - надо потяжельше выбирать...
Вес проверяли? Грибы придавливать ежели - надо потяжельше выбирать...
Неа, вес нам без надобности, а Евгений к толмудам поближе стоит, может в курсах. По фотографии фасада разницы не видно.))))
вот как раз с оной и стянул
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer);
а для меня как для новичка не совсем понятно что там и откуда... ибо подробного описалова нет. дешифруете надпись (char*)pgm_read_word(&(string_table[i])) - буду очень вам благодарен)
croan
Тема про строки в ПРОГМЕМ всплывает на форуме каждый месяц по три раза. Почти каждый из местных гуру обьяснил ее новичкам по нескольку раз - ну надоело уже жевать одно и то же, тем более что каждый новичок считает свою тему уникальной и обижается, когда его "посылают в библиотеку".
Даю вам ссылку на тему. где все. что вы спрашиваете, подробно разжевано. Особенно обратите внимание на сообщение #23 от ЕвгенияП
http://arduino.ru/forum/programmirovanie/ocherednoi-raz-progmem
croan, вам сразу понятно стало! Терминов вы не знаете. А без терминов как объяснят . Это делает это, потому что это.... Бред.
И еще Посмотрите Дом который построил Джек https://www.youtube.com/watch?v=cZf8Ynf5WoU
Вот в СИ это сплошняком. А новички это не переваривают. Потому что они не хотят быть программистами а хотят быть халявщиками.
Жаль, что Вы не понимаете простой вещи - с Вашим нынешним уровнем знаний Вы просто не в состоянии понять ответ на Ваш вопрос про Вашу несчастную строку. Вам ответили что с ней делать уже раз пять и даже код дали, но Вы не понимаете ответов - знаний не хватает. А единственный полезный совет - "пойти в билиотеку" и прокачать знания, воспринимаете так, как будто Вас в другое место посылают.
Рано или поздно, до Вас это дойдёт и Вы таки окажетесь в библиотеке. ну, а если не окажетесь. то так и будете всю жизнь, встретив каждую новую строку, скандалить на форумах и требовать "объяснений". После Н-ого такого захода. Вас уж реально начнут посылать не в библиотеку, а в другие места.
Вам жить, дело Ваше. А ответа про строку не требуйте. Вам уже ответили, просто Вы не поняли. И не поймёте без "библиотеки".
блин, ребятыыыы...
не смог найти (по-крайней мере на понятном мне русском языке),
Если ты не знаешь английского, то нет смысла пытаться заниматься программированием, электроникой и другой наукой.
Россия тут не совсем при делах, и язык этих областей знаний - не русский.
Иди в "Ищу исполнителя" и плати деньги тем, кто знает английский.... Гы!
.................
2All: кстати, а что там у придурка за вопрос был?
Если ты не знаешь английского, то нет смысла пытаться заниматься программированием, электроникой и другой наукой.
Россия тут не совсем при делах, и язык этих областей знаний - не русский.
Иди в "Ищу исполнителя" и плати деньги тем, кто знает английский.... Гы!
Злой ты, у меня так дебилизм языковый и ничего, с хоругвью, гуглом переводчиком и портретом Николая II (Кровавого) пробьемся к истине. А отмазка "не могу найти" обычно переводится как "не хочу искать". Практически все есть в русскоязычном поле. Тот же пргогмем только на этом форуме обсасывают чуть реже, чем мученическую гибель миллиса на пятидесятый день.