RFID RDM6300. Как преобразовать полученные данные в нормальный идентификатор?

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

  if (RDM6300.read()==0x03)break;

Считывается 8 байт

2 35 30 33 43 31 42 0 Schitano: 8 byte
 

неудивительно. Вы же этой проверкой считываете байт ответа... и если он не 0x03 - вы его просто отбрасываете. А ведь это тоже байт кода.

Получается. что вы теперь сохраняете в buffer только каждый второй байт

sharik_28.05
Offline
Зарегистрирован: 05.02.2020
while(RDM6300.available()){
    buffers[count++]=RDM6300.read(); 
    
   if (buffers[count]==0x03){
      Serial.print("Konetc: ");
      Serial.print(count);
      Serial.println("");
      //break;
    }
     //if(count == 14)break; 
    }//while

Результат

Konetc: 13
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0 Schitano: 15 byte
Seriia:  - 131
Nomer:  - 52273
Summa:  - 11
 
0х03 это 13 байт, всё верно.
Но если добавляю выход из while, работает неверно.
b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

если добавляю выход из while, работает неверно.

какой именно break работает неверно - в восьмой строке или в десятой?

b707
Offline
Зарегистрирован: 26.05.2017

Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

В 8 строке.

 

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

В 8 строке.

 

и как именно "неверно"? - старайтесь писать чуть более развернуто. чтоб мне не приходилось переспрашивать...

Может для начала разобраться count ?

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

b707 пишет:

Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4

 

    while(RDM6300.available()){
    char temp=RDM6300.read();
    buffers[count++]=temp; 
    
   if (temp==0x03){
      Serial.print("Konetc: ");
      Serial.print(count);
      Serial.println("");
      break;
   }     
    }//while

Результат

Konetc: 14
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0 Schitano: 15 byte
Seriia:  - 131
Nomer:  - 52273
Summa:  - 11
 
Konetc: 4
31 30 42 3 30 Schitano: 5 byte
Seriia:  - 0
Nomer:  - 52273
Summa:  - 11
 
b707
Offline
Зарегистрирован: 26.05.2017

вы явно не чистите buffer между сериями, у вас там лежат старые данные.

И во-вторых, если считано менее 14 байт - значит пакет считан не полностью и его нужно отбрасывать

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Вы правы, буфер я не чистил.

#include <SoftwareSerial.h>
SoftwareSerial RDM6300(2, 3);
char buffers[20];
byte count;
char seriia[5];
char nomer[5];
char summa[3];


void setup(){
  RDM6300.begin(9600);
  Serial.begin(9600);
}

  
void loop(){
  
  if (RDM6300.available()>0){
    delay(50);
    while(RDM6300.available()){
    char temp=RDM6300.read();
     buffers[count++]=temp;
   if (temp==0x03){
      Serial.print("Konechnyi byte ");
      Serial.print(count);
      Serial.println("");
      break;
   }     
    
    
    }//while

  //Показать данные в HEX
   for (int i=0; i <= count; i++){
      char a=buffers[i];
      Serial.print(a, HEX);
      Serial.print(" ");
   }
  //Показать данные в HEX
Serial.println();

  
  for (byte i=0; i<=3; i++){
      seriia[i]=buffers[i+3];
      nomer[i]=buffers[i+7];
    }
    
summa[0]=buffers[11];
summa[1]=buffers[12];


long decimal_ser = strtol(seriia, NULL, 16);
long decimal_nom = strtol(nomer, NULL, 16);
long decimal_sum = strtol(summa, NULL, 16);
Serial.print("Seriia: ");Serial.print(" - ");Serial.print(decimal_ser);Serial.println("");
Serial.print("Nomer: ");Serial.print(" - ");Serial.print(decimal_nom);Serial.println("");
Serial.print("Summa: ");Serial.print(" - ");Serial.print(decimal_sum);Serial.println("");

while (RDM6300.available())RDM6300.read();
  count = 0;
  Serial.println();
  }
}//loop

Добавил очистку while (RDM6300.available())RDM6300.read();

И задержку сделал 50 мс

Лишних данных не прилетает

Konechnyi byte 14
2 37 35 30 30 38 33 43 43 33 31 30 42 3 0 
Seriia:  - 131
Nomer:  - 52273
Summa:  - 11
 
b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

Вы правы, буфер я не чистил.

 
добавьте, а то в этом коде очистки буфера опять нет.
Или я не понял. что вы имели в виду...
sharik_28.05
Offline
Зарегистрирован: 05.02.2020

b707 пишет:

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

Или я не понял. что вы имели в виду...

 

#include <SoftwareSerial.h>
SoftwareSerial RDM6300(2, 3);
char buffers[20];
byte count;
char seriia[5];
char nomer[5];
char summa[3];


void setup(){
  RDM6300.begin(9600);
  Serial.begin(9600);
}

  
void loop(){
  
  if (RDM6300.available()>0){
    delay(50);
    while(RDM6300.available()){
    char temp=RDM6300.read();
    buffers[count++]=temp;
   
   if (temp==0x03){
      Serial.print("Konechnyi byte ");
      Serial.print(count);
      Serial.println("");
      break;
   }     

    
    }//while

  //Показать данные в HEX
   for (int i=0; i <= count-1; i++){
      char a=buffers[i];
      Serial.print(a, HEX);
      Serial.print(" ");
   }
  //Показать данные в HEX
Serial.println();

  
  for (byte i=0; i<=3; i++){
      seriia[i]=buffers[i+3];
      nomer[i]=buffers[i+7];
    }
    
summa[0]=buffers[11];
summa[1]=buffers[12];


long decimal_ser = strtol(seriia, NULL, 16);
long decimal_nom = strtol(nomer, NULL, 16);
long decimal_sum = strtol(summa, NULL, 16);
Serial.print("Seriia: ");Serial.print(" - ");Serial.print(decimal_ser);Serial.println("");
Serial.print("Nomer: ");Serial.print(" - ");Serial.print(decimal_nom);Serial.println("");
Serial.print("Summa: ");Serial.print(" - ");Serial.print(decimal_sum);Serial.println("");

  while (RDM6300.available())RDM6300.read();
  for (byte i=0; i<count;i++)buffers[i]=NULL;
  count = 0;
  Serial.println();
  }
}//loop

Вконце

  while (RDM6300.available())RDM6300.read();
  for (byte i=0; i<count;i++)buffers[i]=NULL;
  count = 0;

Результат:

Konechnyi byte 14
2 37 35 30 30 38 33 43 43 33 31 30 42 3 
Seriia:  - 131
Nomer:  - 52273
Summa:  - 11
 

 

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Считывает правильно, без лишних байт, задержку оставил 50 мс.

Сейчас всё верно?

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

И сразу вопрос касаемый контрольной суммы:

2 37 35 30 30 38 33 43 43 33 31 30 42 3 
 
Контрольная сумма 11
Это 11 байт между началом посылки, от 2 до байта контольной суммы
Верно?
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В даташите должна быть формула подсчета контрольной суммы.

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Komandir пишет:

В даташите должна быть формула подсчета контрольной суммы.

В даташите на что? На тип карты?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

37 35 30 30 38 33 43 43 33 31 надо прогнать по XOR

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

Контрольная сумма 11
Это 11 байт между началом посылки, от 2 до байта контольной суммы
Верно?
 

даже близко нет :)

Это последовательный XOR десяти байтов данных пакета. Для вашей карты, с которой мы начали вчера

Данные: 75 00 83 CC 31

CRC = 0x75 xor 0x00 xor 0x83 xor 0xCC xor 0x31 = 0xOB

b707
Offline
Зарегистрирован: 26.05.2017

Пример из даташита:

Example: card number: 62E3086CED

CHECKSUM: (62H) XOR (E3H) XOR (08H) XOR (6CH) XOR (EDH)=08H

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

b707 пишете 10 ти, а суммируете 5 ?

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

b707 пишете 10 ти, а суммируете 5 ?

это не я, так в даташите :)

цитата:

CHECKSUM: card 10byte DATA entire do XOR operation

Example: card number: 62E3086CED

CHECKSUM: (62H) XOR (E3H) XOR (08H) XOR (6CH) XOR (EDH)=08H

 

Источник этой путаницы в том, что 5 байтов номера карты передаются в ASCII в HEX формате - получается 10 цифр

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ИМХО надо считать 10 пересылаемых байт - ошибка то возникает в момент передачи

А так как формула подсчета простая - результат не меняется ...

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

ИМХО надо считать 10 пересылаемых байт - ошибка то возникает в момент передачи

надо считать так, как считает модуль :) иначе CRC не совпадет

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В том то и дело что CRC совпадает :-)

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

А так как формула подсчета простая - результат не меняется ...

Уверены?

0x37 xor 0x35 = 0x75 ? :)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B

sharik_28.05
Offline
Зарегистрирован: 05.02.2020
  byte crc[]={37,35,30,30,38,33,43,43,33,31};//10 байт
  byte a;
  a=crc[0]^crc[1];
  a=crc[a]^crc[2];
  a=crc[a]^crc[3];
.....

Такая логика?

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

В том то и дело что CRC совпадает :-)

проверьте

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Так проверил как раз - 37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B

Сижу вот чешу репу - как под это математику подвести ...

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

Так проверил как раз - 37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B

Сижу вот чешу репу - как под это математику подвести ...

Математика против вас. достаточно посчитать CRC первых двух (четырех) байт

0x75 xor 0x00 = 0x75

0x37 xor 0x35 xor 0x30 xor 0x30 = 0x02

так что результат разный и считать нужно тем, что использует контроллер.

Поскольку  37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B - значит считать надо вашим методом.

Почему такой пример в даташите? - фиг знает

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Что сдерживает от подсчета 10 байт ? (как указано в даташите) :-))

САМ В ШОКЕ !!!

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

Что сдерживает от подсчета 10 байт ? (как указано в даташите) :-))

ответил пока вы писали :)

Я с вами не спорю, согласен метод расчета нужно использовать ваш

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
byte CRC=0;
for (i=1;i<=10;i++) CRC ^=buffers[i];

 

sharik_28.05
Offline
Зарегистрирован: 05.02.2020
byte summa[3];    
summa[0]=buffers[11];
summa[1]=buffers[12];

byte CRC=0;
for (byte i=1; i<=10; i++)CRC ^=buffers[i];

Каким образом сравнивать две переменных summa и  SRC ?

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

Каким образом сравнивать две переменных summa и  SRC ?

преобразовать строку summa в число по аналогии со всеми остальными значениями?

Шарик, вы уже начинаете на шею садится. не пора своей головой думать? :)

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Это преобразование у меня изначально есть

summa[0]=buffers[11];
summa[1]=buffers[12];

byte CRC=0;
for (byte i=1; i<=10; i++)CRC ^=buffers[i];

long decimal_sum = strtol(summa, NULL, 16);
Serial.println(decimal_sum);
Serial.println(CRC);

if (decimal_sum==CRC)Serial.println("OK");

Для первой карты условие работает

11
11
OK
 
а для второй
131
15
 
Отсюда и вопрос, что не так?
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Получается надо все таки считать CRC по пяти байтам после конвертации.

0x75 xor 0x00 xor 0x83 xor 0xCB xor 0xBE = 0x83 (131)

sharik_28.05
Offline
Зарегистрирован: 05.02.2020
Konechnyi byte 14
2 37 35 30 30 38 33 43 43 33 31 30 42 3 
Summa: 11
CRC: 11
Seriia:  - 131
Nomer:  - 52273
 
Konechnyi byte 14
2 37 35 30 30 38 33 43 42 42 45 38 33 3 
Summa: 131
CRC: 15
Seriia:  - 131
Nomer:  - 52158
summa[0]=buffers[11];
summa[1]=buffers[12];

byte CRC=0;
for (byte i=1; i<=10; i++)CRC ^=buffers[i];

long decimal_sum = strtol(summa, NULL, 16);

Serial.print("Summa: ");Serial.print(decimal_sum);Serial.println("");
Serial.print("CRC: ");Serial.print(CRC);Serial.println("");

 

 

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Komandir пишет:

Получается надо все таки считать CRC по пяти байтам после конвертации.

0x75 xor 0x00 xor 0x83 xor 0xCB xor 0xBE = 0x83 (131)

Тяжко у меня с байтами...

 /byte crc[]={0x75,0x00,0x83,0xCB,0xBE};//5 байт
  byte a;
for (byte i=0; i<=4; i++)a ^=crc[i];
    Serial.print("CRC: ");
    Serial.print(a);
    Serial.println("");

Так понятно, получаю 131

Мне нужно из 10 байт сделать 5 байт.Как?

 

 
b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

Мне нужно из 10 байт сделать 5 байт.Как?

так же как вы из массива summa делаете decimal_sum

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

b707 пишет:

sharik_28.05 пишет:

Мне нужно из 10 байт сделать 5 байт.Как?

так же как вы из массива summa делаете decimal_sum

 

char t[2];
t[0]=buffers[1];
t[1]=buffers[2];
Serial.println(t);

Получаю 75, а надо 0x75? чтобы записать в массив crc[0]

byte crc[]={0x75,0x00,0x83,0xCB,0xBE};

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

char t[2];
t[0]=buffers[1];
t[1]=buffers[2];
Serial.println(t);

Получаю 75, а надо 0x75? чтобы записать в массив crc[0]

byte crc[]={0x75,0x00,0x83,0xCB,0xBE};

внимательно сравните этот код и код получения decimal_summ из #87.

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

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Не понимаю...

Имею массив 5 байт. Заполняю первый элемент массива = t

Результат на выходе неверный

char  t[3];
t[0]=buffers[1];
t[1]=buffers[2];


byte crc[5];//5 байт
crc[0]=t;//75
crc[1]=0x00;
crc[2]=0x83;
crc[3]=0xCB;
crc[4]=0xBE;

byte a;
for (byte i=0; i<=4; i++)a ^=crc[i];
    Serial.print("CRC: ");
    Serial.print(a);
    Serial.println("")

 

 

b707
Offline
Зарегистрирован: 26.05.2017

ну это уже вообще никуда не годится

сами подумайте - t у вас описан как char t[3]  - то есть массив из трех элементов.  crc[0] - это один байт.

А дальше в строке 7 вы пытаетесь их присваивать друг другу...

 

Смотрите на код #87, думайте

 

sharik_28.05
Offline
Зарегистрирован: 05.02.2020
char t[3];
t[0]=buffers[1];
t[1]=buffers[2];
byte r = strtol(t, NULL, 16);


byte crc[5];//5 байт
crc[0]=r;
.....

тоже бред получается

 

b707
Offline
Зарегистрирован: 26.05.2017

sharik_28.05 пишет:

тоже бред получается

а так:

unsigned char t[3];
t[0]=buffers[1];
t[1]=buffers[2];
t[2] = 0;
byte r = strtol(t, NULL, 16);

 

sharik_28.05
Offline
Зарегистрирован: 05.02.2020

Так и думал что речь о 42 и 45 постах.

Получается что и здесь у меня неправильно

  for (byte i=0; i<=3; i++){
      seriia[i]=buffers[i+3];
      nomer[i]=buffers[i+7];
    }

обязательно нужно добавлять

seriia[4]=0;

nomer[4]=0;

Правильно?

почему unsigned char t[3]; а не char t[3];