Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
13.08.2018, 07:27
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Китайский двухчастный модуль rfid
Привет всем.
Недавно я себе приобрел модуль 7941W по заявлению китайца может писать и читать rfid в данный момент интересует 125кГц, вообщем накидал на макетку шлю ему команду отвечает, ключ читает, но как только пытаюсь что то записать он выдает успешное завершение команды но запись как таковую не производит.
Когда игрался с паузами на отправку каким то чудом удалось произвести запись, но там был не ключ который был послан, а кусок ответа самого модуля.
Ссылка на сам модуль
Возможно, я что то не так делаю в программе, буду рад услышать конструктивную критику по коду=)
В кранце шлем 1 и ждем ключа полученный ключ сохраняем шлем 2 пытаемся его записать.
Нажмите, чтобы открыть спойлер
PHP код:
|
#include ‹SoftwareSerial.h› SoftwareSerial rfidSerial(9, 10);
int lastLenght = 0;//Длина последнего считанного массива byte respose[12], key[5] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //Отдельный массив с ключем и ответом модуля byte readId[6] = {0xAB, 0xBA, 0x00, 0x15, 0x00, 0x15};//Команда на сичтывание //byte writeId[12] = {0xAB, 0xBA, 0x00, 0x16, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};//команда на запись byte writeId[12] = {0xAB, 0xBA, 0x00, 0x16, 0x05, 0x2E, 0x00, 0xB6, 0xA3, 0x02, 0x2A};//команда на запись
void setup() { Serial.begin(115200); rfidSerial.begin(115200); }
void loop() { int rd = Serial.read(); if (rd == '1')// ждем ключ и пишим егов массив key { vaitKey(100); keySe(); printKey(respose); } if (rd == '2')//пытаемся записать ключ { //================================================ int op = 0; for (int t = 5; t ‹ 10; ++t) { writeId[t] = key[op];//формируем команду для отправки модулю ++op; } writeId[10] = xorCheck(writeId);//вставляем последний байт с чек суммой //sendComand(writeId, 10); //================================================ //vaitKey(100); //printKey(respose, lengt);
Serial.print("Old key: "); // clearRespose(); // vaitKey(100);//Джем ключа // printKey(respose);//выводим ключ // // clearRespose(); sendComand(writeId, 11);//отправляем команду на запись readRespose();//читаем ответ printKey(respose);//смотрим че пришло
while (true) { vaitKey(100);//ждем ключа для кго проверки if (keyCheck())//проверяем равны ли ключи { //vaitKey(100);// если все хошоло то запрашиваем записанный printKey(respose);//выводим его Serial.print("Write Success"); return; } else { //delay(200); clearRespose(); sendComand(writeId, 11);//Отправляем команду назапись readRespose();//Читаем ответ printKey(respose);//выводим его } } } if (rd == '3') {
} }
boolean keyCheck()//Проверяем равны ли считанный ключ с тем что пришел в ответ на запрос { int yy = 0; for (int o = 5; o ‹= 9; ++o) { if (respose[o] != key[o - 5]) { return false; } ++yy; } return true; }
void printKey(byte rp[])//Вывод в консоль { char str[20]; if (rp[4] == 0x00)// если модуль вернул 0 в значении длинна данных то выводим только команды { Serial.print(millis() / 1000); Serial.print("›› Key: "); for (int tr = 2; tr ‹= 5; ++tr) { Serial.print(rp[tr], HEX); Serial.print(" "); } Serial.println(""); } else// Выводим весь ответ { Serial.print(millis() / 1000); Serial.print("›› Key: "); for (int tr = 5; tr ‹= 10; ++tr) { Serial.print(rp[tr], HEX); Serial.print(" "); } Serial.print("Lenght: "); Serial.print(rp[4], HEX); Serial.println(""); } }
void readRespose()//Процедура чтения ответа { /*По протококу модуль в начало ответа шлет заголовок CD DC */ int yp = 1; if (rfidSerial.read() == 0xCD)// Отлавливаем заголовок { while (rfidSerial.available() › 0)// Читаем пока есть данные { respose[yp] = rfidSerial.read(); //Serial.print(respose[yp], HEX); //Serial.print(" "); ++yp; lastLenght = yp;// Счетцик считанных байтов } Serial.flush(); //Serial.println(""); } }
void keySe()//Выдираем из массива отвера 5 байт самого ключа { int k = 0; if (respose[3] == 0x81) { for (int ui = 5; ui ‹= 9; ++ui) { key[k] = respose[ui]; ++k; } } }
void vaitKey(int vait)//Ждем считываение ключа { do { clearRespose(); // очистка массива перед чтением //rfidSerial.flush(); // На всякий сделал очистку кэша порта sendComand(readId, 6);// Отправляем команду заранее прописанную в массиве AB BA 00 15 00 15 readRespose(); // Читаем ответ в массив respose delay(vait); // Пауза чтобы не сильно напрягать модуль } while (respose[3] == 0x00 || respose[3] == 0x80); /* В случае успешного выполнения команды модуль шлет 81 и в случае провала 80 00 на проверке про причине первоначальной очистки массива.*/ }
void sendComand(byte comand[], int lenght) //Отправляем команду модулю { rfidSerial.write(comand, lenght); }
void clearRespose() //Очистка массива в котором хранится ответ { for (int r = 0; r ‹ 12; ++r) { respose[r] = 0; } }
byte xorCheck(byte rr[]) //Чек сумма отправляемого запроса { int z = 0; for (int i = 2; i ‹= 9; ++i) { z = z ^ rr[i]; } return z; }
|
Последний раз редактировалось GrafGrigorio; 13.08.2018 в 07:36.
|
|
|
|
13.08.2018, 10:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.03.2006
Сообщений: 3,611
Сказал спасибо: 141
Сказали Спасибо 427 раз(а) в 377 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
GrafGrigorio, может быть длина пароля ?
...
|
|
|
|
13.08.2018, 12:01
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
GrafGrigorio, для начала - код таки стоит вставлять как файл, так будет сильно меньше непоняток с отсутствием его частей (минимум в первой строке в угловых скобках). Да и смотреть код каждому желающему в привычном редакторе как-то удобнее , можно даже в двух кодировках - 1251 и Unicode.
По сути вопроса - тут стоит очень внимательно покурить DS на сам модуль и проверить все цепочки команд, длины буферов и настройки. Чудес при работающем модуле не бывает…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
14.08.2018, 00:23
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
Сообщение от johanh
|
GrafGrigorio, может быть длина пароля ?
...
|
Пароль нужен только для частоты 13.56 в данном случае используется простая nmarine.
mike-y-k файлы добавил, по поводу цепочки команд и буферов хотелось бы поподробнее.
|
|
|
|
14.08.2018, 01:28
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
GrafGrigorio, так а где нормальное описание на модуль?
И на каком вартианте arduino это все у Вас запускается?
По ссылке на модуль маловато информации, только если брать такой же и разбираться и с его прошивкой, и с протоколом
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
14.08.2018, 02:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.03.2006
Сообщений: 3,611
Сказал спасибо: 141
Сказали Спасибо 427 раз(а) в 377 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
GrafGrigorio, Может быть длина слова ?
Вроде на страничке продажи описаны все команды и протоколы.
И примеры есть.
Пролистать страничку вниз.
...
Последний раз редактировалось johanh; 14.08.2018 в 03:44.
|
|
|
|
14.08.2018, 04:47
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Китайский двухчастный модуль rfid
Сообщение от mike-y-k
|
GrafGrigorio, так а где нормальное описание на модуль?
И на каком вартианте arduino это все у Вас запускается?
|
Вся информация что я располагаю это ссылка на товар, ардуино нано, пытался найти похожие, находил только ридеры, продаван говорит, что у тебя брелок не такой.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:09.
|
|