RС522 как получить UID?
- Войдите на сайт для отправки комментариев
Сб, 13/10/2018 - 20:39
подскажите, пожалуйста, строчка
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
выводит в serial всю информацию о карте. Как получить только UID себе в переменную?
гуглил, пробовал, не справился
подскажите, пожалуйста, строчка
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
выводит в serial всю информацию о карте. Как получить только UID себе в переменную?
гуглил, пробовал, не справился
Ключ лежит в mfrc522.uid - пользуйся.
sadman41, DIYMan - спасибо! Я вам благодарен, кроме шуток, но ваши ответы для тех, кто знает язык.
У меня таких знаний нет. Как получить только UID себе в переменную?
В какую переменную: байтовую, трехбайтовую, массив, строчную? Ваш вопрос абстрактен - понимаете?
в строчную
Если в string, то не не буду советовать как (не в курсе), а в null-terminated... да хоть индусским методом через snprintf(..., ..., uid.uidByte[0], uid.uidByte[1], uid.uidByte[2], ...)
в строчную
Каждый байт uid'а в строке в каком виде должен быть представлен? В виде HEX-представления, в десятичной системе счисления, в двоичной, в восьмеричной?
в hex представлении
чтоб в переменной оказалось "12 4A 45 81". я так понимаю в mfrc522.uid в таком виде и хранится
в hex представлении
чтоб в переменной оказалось "12 4A 45 81". я так понимаю в mfrc522.uid в таком виде и хранится
Нет, неправильно понимаете - в mrfc522.uid хранится в виде массива байт, никаких строк. Подозеваю, что вы чего-то там хотите друг с другом сравнить, и пытаетесь это сделать через строку. Так?
Втупую, как вариант:
Тип того. Ваш код не смог заставить работать
Тип того. Ваш код не смог заставить работать
Беда.
BTW, читайте про memcmp - и не надо гонять преобразования туда-сюда - сравниваете один массив байт с другим, и всё.
сам в шоке )
Слушайте, вы уже третий день мучаетесь с этими несчастными ключами. Я вам уже говорил - не надо сравнивать строками, это в десять раз медленнее будет работать. У вас проблема понимания - как сохранить в файл ключи не в виде строк, а просто набором байт. Это простейший код, и не зря я вам советую почитать основы. Сейчас ощущение такое, что вы взялись за то, в чём совершенно не понимаете ни строчки кода.
Может, начать с примеров попроще?
С большим уважением к Вам отношусь
Но мне надо выполнить задачу и, возможно, тыщу лет не придется с этим сталкиваться.
Пожалуйста, помогите получить 4 байта в стринг, остальные советы сейчас не нужны. В данном случае мне нужна эта четырехбайтовая строка, что б записать в лог и на случай, если вдруг для чего то еще пригодится. А сравнивать, как раз, планирую вашим алгоритмом.
Все верно, третий день мучаюсь, поэтому извините, если грубовато.
вот здесь чел выводит в сериал то, что мне нужно, строку формата C28CD130
как это заполучить в переменную типа string в таком же формате?
как это заполучить в переменную типа string в таком же формате?
Так же, как я писал пример выше. Почему он у вас не завёлся - не знаю, вы что-то делаете неправильно.
как заполучить в переменную типа string в таком же формате?
как заполучить в переменную типа string в таком же формате?
Знаешь, в чём поблема в этом коде? Емнип, код из Wiring не печатает лидирующие нули, т.е. вместо "0С" напечатает "С". Это если мне склероз не изменяет сегодня. Но данный нюанс, при его наличии - смертелен во многих применениях, в том числе, если вторая строка, для сравнения - содержит оба полубайта. А если данное кодирование нужно для представления в UCS2 - то там строго 2 символа на байт, нельзя отбрасывать лидирующие нули, иначе - каша.
Если склероз меня таки замучил - сорри, проверить щас не могу - не за рабочим компом.
Знаешь, в чём поблема в этом коде? Емнип, код из Wiring не печатает лидирующие нули, т.е. вместо "0С" напечатает "С".
Если склероз меня таки замучил - сорри, проверить щас не могу - не за рабочим компом.
Если это так - это реальный косяк Вайринга. Надо бы проверить... но я тоже далеко от ардуинок... Как доберусь - обязательно посмотрю.
Знаешь, в чём поблема в этом коде? Емнип, код из Wiring не печатает лидирующие нули, т.е. вместо "0С" напечатает "С".
Если склероз меня таки замучил - сорри, проверить щас не могу - не за рабочим компом.
Если это так - это реальный косяк Вайринга. Надо бы проверить... но я тоже далеко от ардуинок... Как доберусь - обязательно посмотрю.
Щас проверим ;) Не хотелось комп включать - а придётся :)
Но мне надо выполнить задачу и, возможно, тыщу лет не придется с этим сталкиваться.
Простите, но это только кажется, что "вот эту строчку спрошу - и все".С Вашим уровнем у вас только два варианта - Либо вы еще упретесь в проблемы ни раз и ни два и так и будете выпрашивать в конфе почти каждую строчку кода , либо быстро бросите это дело.
Так что наиболее правильно - учиться.
не успел написать вам про то, что вы еще ни раз придете - а вы уже пришли.
Зачем же вы переврали мой код? Разве в том месте, где вы взяли код, в котором "человек выводил байты на печать" - массив ReadCard[] был описан как String? - посмотрите внимательно, каждую запятую мы вам тут подсказывать не будем...
Если это так - это реальный косяк Вайринга. Надо бы проверить... но я тоже далеко от ардуинок... Как доберусь - обязательно посмотрю.
ЧТД, собственно:
Выхлоп:
Мой код:
Выхлоп:
DIYMan, не выключай комп, глянь еще - иннициализация строки String(0x0C, HEX); - тоже теряет ноль или нет?
DIYMan, не выключай комп, глянь еще - иннициализация строки String(0x0C, HEX); - тоже теряет ноль или нет?
Ещё хуже :)
Выхлоп:
Ещё и регистр стал ролять :)
З.Ы. IDE 1.8.5
Зачем же вы переврали мой код?
прошу прощения, я не понял, что Ваш код связан с тем кодом
Все получилось, спасибо большое
DIYMan - у тебя там наворочено - PROGMEM, сдвиги :)
Наш рабочекрестьянский ответ Вайрингу :)
Все получилось, спасибо большое
Отлично ;) Только не забудьте, что сравнивать строки вместо того, чтобы сравнивать макссив байт (в вашем случае лучше второе) - это не то, чтобы "не очень", это - дичь. Ну и, как писал: если будете сравнивать строковое представление массива байт, полученное при помощи разных подходов - ничего не выйдет, вот пример: код с использованием стандартных средств (как в примере b707) для четырёх байт 0x0C выдаст вам строку "CCCC", а код, который правильно учитывает оба полубайта - строку "0C0C0C0C". Как думаете, если сравнить эти две строки - будут они равны, или нет?
Короче, вы сами себе раскидываете вокруг грабельки. Не говорите потом, что вас не предупреждали ;)
прошу прощения, я не понял, что Ваш код связан с тем кодом
Все получилось, спасибо большое
учтите замечание DIYMan-а о лидирующем нуле - а то работать не будет.
Правильный код из сообщения #29
DIYMan - у тебя там наворочено - PROGMEM, сдвиги :)
Наш рабочекрестьянский ответ Вайрингу :)
Да из проекта выдирал, без претензий. Можно и попроще написать, без буфера в PROGMEM и без сдвигов, с масками.
Твой код - вольно обходится с оперативкой, тогда уж лучше:
Выделили 9 байт (по два символа на байт + завершающий ноль), и в дальнейшем нет переаллоцирования.
Твой код - вольно обходится с оперативкой, тогда уж лучше:
.....
Выделили 9 байт (по два символа на байт + завершающий ноль), и в дальнейшем нет переаллоцирования.
спасибо за уточнение, а то я в Стрингах не але :) - я их просто избегаю, за два года ни разу не использовал в проектах :)
Поэтому я советовал через printf залепить - он нули не теряет. И это не косяк... Wiring и в бинарном выводе нули не предпечатывает, и в десятичном. Нуль можно засунуть через ((b>15) ? "" : "0")...
Если нигде навскидку не ошибся, ещё один вариант:
Поэтому я советовал через printf залепить - он нули не теряет. И это не косяк... Wiring и в бинарном выводе нули не предпечатывает, и в десятичном. Нуль можно засунуть через ((b>15) ? "" : "0")...
Да не, это не косяк, это просто особенность. Ясное дело, что можно ведущие нули самому анализировать и добавлять, при необходимости. Мне тупо было проще для UCS2 по-бырому накидать свой аналог. printf не очень хотел - не нра анализ форматтеров, не для МК это дело, кмк. Хотя - дело вкуса, можно и так, и сяк ;) Тут всё зависит от задачи: в моём случае - буфер под UCS2 - высчитывается легко, статический буфер из трёх символов - да фик с ниг, небольшой оверхэд в обмен на быстродействие ;) Приведённый в моем предыдущем сообщении пример - сам юзать не буду, потому как там String возвращается: нахрена мне такие пляски с памятью? ;)
З.Ы. Внутри String - банальные ultoa сотоварищи.
DIYMan, а рази вот тут
не вызовеца автоматом деструктор String? Тогда ссылка будет повисшей
ЗЫ вернее, валидной только до следующего выделения памяти.
DIYMan, а рази вот тут
не вызовеца автоматом деструктор String? Тогда ссылка будет повисшей
ЗЫ вернее, валидной только до следующего выделения памяти.
Не, не вызовеца: на стеке останется указатель на экземпляр String. Если никто возвращаемое значение не юзает - то тогда, по выходу из области видимости - да, вызовеца деструктор. Если юзает - тоже вызовеца, но - позже :) Короче, там всё норм с памятью ;)
И это не косяк... Wiring и в бинарном выводе нули не предпечатывает, и в десятичном.
Это именно что не косяк, т.к. ведущий "0" для Си - признак числа в 8-чной системе.
И это не косяк... Wiring и в бинарном выводе нули не предпечатывает, и в десятичном.
Это именно что не косяк, т.к. ведущий "0" для Си - признак числа в 8-чной системе.
При записи в коде - да. А вот в строке - не всегда это допустимо, пример с UCS2 - я приводил: там строго 2 символа на байт.
При записи в коде - да. А вот в строке - не всегда это допустимо, пример с UCS2 - я приводил: там строго 2 символа на байт.
Ну, понятно, что никто не запрещает при выводе, скажем, времени или даты использовать ведущие нули. Но в общем случае форматное преобразование должно быть максимально обратимо, а ведущие нули эту обратимость серьезно портят. Поэтому при выводе по умолчанию их быть не может.
При записи в коде - да. А вот в строке - не всегда это допустимо, пример с UCS2 - я приводил: там строго 2 символа на байт.
Ну, понятно, что никто не запрещает при выводе, скажем, времени или даты использовать ведущие нули. Но в общем случае форматное преобразование должно быть максимально обратимо, а ведущие нули эту обратимость серьезно портят. Поэтому при выводе по умолчанию их быть не может.
Не согласен. Если мы говорим о строках, то при первом взгляде на строку "СС" - сходу непонятно, сколько в ней забито байт - один, два?. А вот если "0С0С" - то уже можно сделать осторожный вывод, что там - два байта. Т.е. в случае со строковых HEX-представлением потока байт, лично я считаю, что ведущие нули - просто обязаны быть. Хотя бы потому, что НИКАКОГО отношения к формату записи чисел в ИСХОДНИКЕ - они не имеют. А вот к представлению байта в строке - имеют, ещё какое, потому что байт в строковом представлении - это ВСЕГДА два квартета, каждый квартет - представлен символом '0'-'F'. Поэтому сходу отбрасывать ведущие нули при конвертации байта в набор символов, БЕЗ дополнительной информации - лично я считаю неправильным.
Если же мы конвертируем байт в строку как "0x" + значение байта - тогда ведущий ноль - не имеет значения, поскольку в данном конкретном случае признаком начала значения байта служит префикс "0x".
Не, не вызовеца: на стеке останется указатель на экземпляр String. Если никто возвращаемое значение не юзает - то тогда, по выходу из области видимости - да, вызовеца деструктор. Если юзает - тоже вызовеца, но - позже :) Короче, там всё норм с памятью ;)
Или я чота не понимаю?
Когда функция возвращает объект, автоматически создается временный объект, содержащий возвращаемое значение. Именно этот объект фактически возвращается функцией. После того, как значение возвращено, этот объект уничтожается. Уничтожение временного объекта может вызывать неожиданные побочные эффекты в некоторых ситуациях. Например, если возвращаемый функцией объект имеет деструктор, освобождающий динамически зарезервированную память, то эта память будет освобождена даже в том случае, когда объект, получающий возвращаемое значение, будет продолжать использовать ее. Имеются способы преодолеть эту проблему, для чего используется перегрузка оператора присваивания и определение конструктора копирования.
Я какта думал, что локальный объект в С++ (созданный унутре функции), при выходе из нее отоматически уничтожается. Даже думал, что это преимущество перед обьектной моделью Delphi, где надо всё ручками, создал-уничтожил. Теперь аказываеца, мне надо пить три дня, чтобы снова привести в гармонию своё виденье мира.
Имеются способы преодолеть эту проблему, для чего используется перегрузка оператора присваивания и определение конструктора копирования.
Не боись: в классе String всё есть ;)
Не боись: в классе String всё есть ;)
Если так, то хорошо, спс за разъясненья.
Я какта думал, что локальный объект в С++ (созданный унутре функции), при выходе из нее отоматически уничтожается. Даже думал, что это преимущество перед обьектной моделью Delphi, где надо всё ручками, создал-уничтожил. Теперь аказываеца, мне надо пить три дня, чтобы снова привести в гармонию своё виденье мира.
Ок, давай разбираться по пунктам:
1. Внутри функции создали объект, в нашем случае - экземпляр класса String;
2. Вернули его из функции возвращаемым значением.
И вот тут - есть два варианта:
1. Когда всемпох на возвращаемое значение. В этом случае вызывается деструктор, объект - тю-тю, выделенная внутри него память - тю-тю, сразу же;
2. Когда возвращаемое значение юзается. Тогда - есть нюансы. В общем случае - для объекта должны быть определены конструктор копирования и оператор присваивания. Если их нет - будет побайтовое копирование, что чревато, после уничтожения временного объекта, возвращаемого из функции - всякими бяками, типа той, о которой ты говорил - указатель куда-то на уже освобождённую память.
Если всё норм, и есть конструктор копирования и оператор присваивания, то - похер мороз. В нашем рассматриваемом случае : в объекте-получателе создаём кусок памяти, копируем тудыть из временного объекта, выходим. После этого (именно об этом я говорил, написав "чуть позже") - объект, возвращённый из функции - тю-тю, но у нас уже есть копия его данных.
Есть ещё всякие хитрости, типа подсчёта ссылок, чтобы память не насиловать, но это уже - чуть из другой лиги.
Короче, не парься ;)
З.Ы. Именно по причине оптимизации работы с памятью нельзя делать:
Потому что на стеке тупо создастся КОПИЯ передаваемого в функцию значения, следовательно - память под символы в той строке тоже будет выделена. Представь, шо там 500 байт длиной строка висит ;) Вместо этого надо передавать по ссылке:
Тогда копия объекта на стеке создана не будет. Если объект ниннада изменять внутри функции, то:
И волосы мягкие и шелковистые :)
З.З.Ы. Вот выдержки из исходников:
Всё наглядно ;)
Не, ну теперь то паняна всё. Спасибо. Буду знать.
Вбил себе в мозг, что в общем случае так делать нельзя, надо смотреть на реализацию класса. Если есть копирущий конструктор и оператор =, значить временный обьект из функции отдавать можно.
Вбил себе в мозг, что в общем случае так делать нельзя, надо смотреть на реализацию класса. Если есть копирущий конструктор и оператор =, значить временный обьект из функции отдавать можно.
Можно и без конструктора копирования и оператора =. Дело-то в том, что внутри, т.е., в реализации:
Передавай куда хошь, побайтово скопирует. При этом нет твоей реализации operator= и конструктора копирования - компилятор втихушку сделал их по умолчанию. Побайтовое копирование в данном случае - безопасно, ничего с памятью не станется.
Могу только еще раз поблагодарить за знания. Налью при случае. :)