RFID RDM6300. Как преобразовать полученные данные в нормальный идентификатор?
- Войдите на сайт для отправки комментариев
Ср, 25/01/2017 - 19:23
Win-cчитыватель читает мой rfid-ключ: 3F 00 A2 D0 C0
А arduino mega adk + RFID RDM6300 возвращают с порта варианты (hex/dec):
33 30 41 44 43 38 3
2 51 70 48 48 65 50 68 48 67 48 56 68 3
33 46 30 30 41 32 44 30 43 30 38 44
Как из этого получить нормальный идетификатор 3F 00 A2 D0 C0?
2 в начале, 3 в конце - так порт шлёт, спецификация такая. Исключать надо
Как переводить?) 3F как получить от туда?)
Не справлюсь никак, пол дня уже))
Гдето у меня валялся такой - надопопробовать накодить чегонить.
Поидее все просто вначале числовую строку надо преобразовать в символьную, а потом символьную в число(в 5 байт).
На моих данных приведите пример пожалуйста, что во что и как преобразовывать :)
Тут дело не в устройстве, оно данные шлёт. Вопрос в том, как их преобразовать в нужный вид
33 = 3
46 = F
И т.д. по таблице ASCII.
СПАСИБО! ТЕПЕРЬ ПОНЯЛ!
Использую Mega2560 и дисплей 2004 i2c
Здравствуйте.
У меня вопрос следующий, на всех моих картах имеется серия и номер, которые напечатаны на самой карте, к примеру
131, 52273
А я при считывании получаю
А я при считывании получаю
неправильно читаете.
Вы считываете коды символов, пришедших с RFID, потом превращаете коды в их строковое представление и записываете в строку. Так у вас получается полная ерунда - во-первых строка очень далека от реального кода, считанного с карты. а во вторых то. что длина этой строки 26 символов - никак не связано с тем, что на карте 26-символьный код...
1. Записывайте считанные значения не в String, а символьный массив.
2. Чтобы считать с карты 26-символьный код- нужно выполнить read() 26 раз.
Получаю
Перед 75 и после 0B тоже есть символы (отображаются квадратиком)
вместо строчки 23. которая печатает лабуду, напишите вывод массива buffer на печать поэлементно в HEX виде
Так?
Строка 16 лишняя. Пробелы вставьте между соседними значениями.
Получаю
Получаю
если паузу оставить - с одной карты идет всегда одна и та же строчка?
Да
Да
А вот такой надписи на карте нет?
75 00 83 СС 31 0B
Нету, изначально проверил эту надпись через конвертер
В программе, при добавлении новых пропусков, ввожу 131, 52273
Считыватель карту сверяет с этим значением.
Стоп, прикладываю другой пропуск, получаю это же значение.
Стоп, прикладываю другой пропуск, получаю это же значение.
По моему первому скетчу
По моему первому скетчу
я уже писал, что в вашем первом скетче слишком много ошибок.
а если эти же пропуска считать новым кодом?
Стоп, прикладываю другой пропуск, получаю это же значение.
Да, 100%, в программе ввожу серию и номер, и всё ок
Да, 100%, в программе ввожу серию и номер, и всё ок
в какой программе то7
Последним кодом получаю
Да
те данные, что вы получаете с карты этим кодом - имеют правильный формат. Начало посылка "2", конец "3" - означает что код принят полностью. А между двойкой и тройкой 12 байт - 2 байта версия, 8 байт таг и 2 байта контрольной суммы.
Так что судя по всему, все читается правильно.
Мне нужно придти к чему то, либо конвертировать базу, значения серия и номер в формат считывания через RDM6300, либо наоборот.
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0
все просто
Для первой карты
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0 = таг 00 83 СС 31
0x0083 = 131
0xCC31 = 52273
0x0083 = 131
0xCBBE = 52158
Как конвертировали?
Как конвертировали?
так я ж вроде выше все расписал. Строчка
2 37 35 30 30 38 33 43 43 33 31 30 42 3 - это HEX коды символов таблицы ASCII. Перводим в символы - получаем:
2 7 5 0 0 8 3 С С 3 1 0 B 3
удобнее записать парами, отбросив первую двойку и последнюю тройку:
75 00 83 СС 31 0B
Первые два байта. "75" - версия протокола. Последние два - "0В" - контрольная сумма Между ними - тег карты
Спасибо. В итоге всё получилось, но код мне мой не нравится
Спасибо. В итоге всё получилось, но код мне мой не нравится
ужас!
Зачем эта возня со String и поиском числа 75 ? А вдруг 75 встретится в самом коде карты - и все, программа встанет?
На самом деле можно написать проще. По спецификации ответ ридера должен начинатся с байта 0x02, длина его 14 байт и заканчиваться он должен байтом 0x03. Вот от этого и надо отталкиваться. При этом для кода "131 52278" первое число лежит в маcсиве buffer по смещению buffer+3 . а второе число - по смещению buffer+7
И не надо искать никакие подстроки, конвертировать buufer в String, а потом обратно в C_str()...
del
Нулевой байт в буфере равен 0x02 - верно
Последний байт равен 0х03 (у меня он предпоследний, последний равен 0) - верно
А вот этот момент не понимаю
2 7 5 0 0 8 3 С С 3 1 0 B 3
0 1 2 3 4 5 6 7 8 9
2 7 5 0 0 8 3 С С 3 1 0 B 3
0 1 2 3 4 5 6 7 8 9
Это я понимаю.
char seriia верно заполняю? (в цикле будет) или есть иной вариант?
В конце считанного массива 2 37 35 30 30 38 33 43 43 33 31 30 42 3 0
находится 0
это конец строки \0?
И еще вопрос
Получаю
Считано 14 байтов - выводишь 15 ? Вот он и лишний 0 в конце.
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0
15 байт, отсчет от 0
ИМХО нужен пятый символ в seriia и nomer в виде пробела или нуля (конец строки - не 0x30 !).
Спасибо
Сейчас у меня выход из цикла после чтения 15 байта. Это верно?
Лучше ловить символ окончания строки, как сделать?
char seriia[5];
Это условно верно, если не забывать что можно и отключить начальную очистку переменных !
По поводу 14 - 15 не подскажу. Нет такого железа под рукой.
Сейчас у меня выход из цикла после чтения 15 байта. Это верно?
Лучше ловить символ окончания строки, как сделать?
Лучше ловить символ 0x03 - по стандарту именно он означает окончание ответа от ридера.
Ну и неплохо бы добавить в код проверку контрольной суммы, раз она есть в пакете.
Строка 22 работает неправильно. В чем косяк?
С контрольной суммой (crc) разбираюсь.
Строка 22 работает неправильно. В чем косяк?
уберите кавычки
В одинарных кавычках можно указывать одиночный печатный символ, например 'a' или код символа после слежа. например '\0'. Если же вы пишете 0x03 - то это просто число и никакие кавычки не нужны.
if (RDM6300.read()==0x03)break;
Считывается 8 байт