Опять про rdm6300 125кгц - как перевести в десятичный формат попроще.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

есть вот такой считыватель http://arduinolab.pw/index.php/2019/08/29/rfid-schityvatel-s-uart-interfejsom-rdm6300/

выводит ид ключа в хексе.

Мне нужно выводить ключ как он написан на самом ключе. Как это сделать? Когда то по моему видел готовую библиотеку под это, но то что нахожу сейчас и пробую - не выводит в нужном формате.

rkit
Offline
Зарегистрирован: 23.11.2016

Взять и написать пять строчек кода не пробовал?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

пробовал, но не знаю как можно перевести одно в другое. 

То, что писал - на выходе цифры совсем не те. Поискал в интеренете, а помню, что библиотека готовая есть для 6300 которая десятичный выводит - не нашел. Как бы изобретатть велосипед тоже не хочу, так как и знаний не очень. Вот и обратился - кто знает эту библиотеку? ВЫ знаете?

rkit
Offline
Зарегистрирован: 23.11.2016

Не надо никакой библиотеки. Это слишком просто для библиотеки. Приведи свой код полностью и внятное описание проблемы.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

вы видели что пишется на самих рфид таблетках?  0007820706   пишется

а контроллер выдает не точно код в этом же формате, а выдает например  2C007755A2 (HEX)

или 0A0065F21D80

 

мне нужно чтобы точно то же получать, что и написано на таблетках рфид. преобразовать "04006d0ba0" в "00008596950352".

 

https://coderoad.ru/29798566/RFID-алгоритм-для-получения-карты-ID

подобная тема обсуждалась похоже уже, но тоже не так все просто в лоб решается, посмотрите: http://arduino.ru/forum/programmirovanie/hex-dec

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Short Circuit пишет:

мне нужно чтобы точно то же получать, что и написано на таблетках рфид. преобразовать "04006d0ba0" в "00008596950352".

Возможно, мой калькулятор врет, но у меня шестнадцатиричное "04006d0ba0" равняется десятичному "17187015584", но никак не "00008596950352".

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

в том то дело, там начало - это не номер.

https://mschoeffler.com/2018/01/05/arduino-tutorial-how-to-use-the-rdm630-rdm6300-rfid-reader/

Похоже то, что мне нужно, но сразу и не пойму, мне разбираться не 5 мин:)

насколько я понял, вначале идет идентификатор, потом сам айди рфида, потом чексумма..

// (c) Michael Schoeffler 2018, http://www.mschoeffler.de
#include <SoftwareSerial.h>

const int BUFFER_SIZE = 14; // RFID DATA FRAME FORMAT: 1byte head (value: 2), 10byte data (2byte version + 8byte tag), 2byte checksum, 1byte tail (value: 3)
const int DATA_SIZE = 10; // 10byte data (2byte version + 8byte tag)
const int DATA_VERSION_SIZE = 2; // 2byte version (actual meaning of these two bytes may vary)
const int DATA_TAG_SIZE = 8; // 8byte tag
const int CHECKSUM_SIZE = 2; // 2byte checksum

SoftwareSerial ssrfid = SoftwareSerial(6,8); 

uint8_t buffer[BUFFER_SIZE]; // used to store an incoming data frame 
int buffer_index = 0;

void setup() {
 Serial.begin(9600); 
 
 ssrfid.begin(9600);
 ssrfid.listen(); 
 
 Serial.println("INIT DONE");
}

void loop() {
  if (ssrfid.available() > 0){
    bool call_extract_tag = false;
    
    int ssvalue = ssrfid.read(); // read 
    if (ssvalue == -1) { // no data was read
      return;
    }

    if (ssvalue == 2) { // RDM630/RDM6300 found a tag => tag incoming 
      buffer_index = 0;
    } else if (ssvalue == 3) { // tag has been fully transmitted       
      call_extract_tag = true; // extract tag at the end of the function call
    }

    if (buffer_index >= BUFFER_SIZE) { // checking for a buffer overflow (It's very unlikely that an buffer overflow comes up!)
      Serial.println("Error: Buffer overflow detected!");
      return;
    }
    
    buffer[buffer_index++] = ssvalue; // everything is alright => copy current value to buffer

    if (call_extract_tag == true) {
      if (buffer_index == BUFFER_SIZE) {
        unsigned tag = extract_tag();
      } else { // something is wrong... start again looking for preamble (value: 2)
        buffer_index = 0;
        return;
      }
    }    
  }    
}

unsigned extract_tag() {
    uint8_t msg_head = buffer[0];
    uint8_t *msg_data = buffer + 1; // 10 byte => data contains 2byte version + 8byte tag
    uint8_t *msg_data_version = msg_data;
    uint8_t *msg_data_tag = msg_data + 2;
    uint8_t *msg_checksum = buffer + 11; // 2 byte
    uint8_t msg_tail = buffer[13];

    // print message that was sent from RDM630/RDM6300
    Serial.println("--------");

    Serial.print("Message-Head: ");
    Serial.println(msg_head);

    Serial.println("Message-Data (HEX): ");
    for (int i = 0; i < DATA_VERSION_SIZE; ++i) {
      Serial.print(char(msg_data_version[i]));
    }
    Serial.println(" (version)");
    for (int i = 0; i < DATA_TAG_SIZE; ++i) {
      Serial.print(char(msg_data_tag[i]));
    }
    Serial.println(" (tag)");

    Serial.print("Message-Checksum (HEX): ");
    for (int i = 0; i < CHECKSUM_SIZE; ++i) {
      Serial.print(char(msg_checksum[i]));
    }
    Serial.println("");

    Serial.print("Message-Tail: ");
    Serial.println(msg_tail);

    Serial.println("--");

    long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE);
    Serial.print("Extracted Tag: ");
    Serial.println(tag);

    long checksum = 0;
    for (int i = 0; i < DATA_SIZE; i+= CHECKSUM_SIZE) {
      long val = hexstr_to_value(msg_data + i, CHECKSUM_SIZE);
      checksum ^= val;
    }
    Serial.print("Extracted Checksum (HEX): ");
    Serial.print(checksum, HEX);
    if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum
      Serial.print(" (OK)"); // calculated checksum corresponds to transmitted checksum!
    } else {
      Serial.print(" (NOT OK)"); // checksums do not match
    }

    Serial.println("");
    Serial.println("--------");

    return tag;
}

long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value
  char* copy = malloc((sizeof(char) * length) + 1); 
  memcpy(copy, str, sizeof(char) * length);
  copy[length] = '\0'; 
  // the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated.
  long value = strtol(copy, NULL, 16);  // strtol converts a null-terminated string to a long value
  free(copy); // clean up 
  return value;
}

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
rkit
Offline
Зарегистрирован: 23.11.2016

Проще некуда