Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4
Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4
Получаю 75, а надо 0x75? чтобы записать в массив crc[0]
bytecrc[]={0x75,0x00,0x83,0xCB,0xBE};
внимательно сравните этот код и код получения decimal_summ из #87.
Шарик, уже одни и те же вопросы по кругу задаете. Как составить число из символьного массива - вам Командир рассказал на прошлой странице. Похоже. он это сделал зря. надо было заставить вас самому решить эту задачу. а то у вас ничего в голове не отложилось...
if (RDM6300.read()==0x03)break;
Считывается 8 байт
неудивительно. Вы же этой проверкой считываете байт ответа... и если он не 0x03 - вы его просто отбрасываете. А ведь это тоже байт кода.
Получается. что вы теперь сохраняете в buffer только каждый второй байт
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Результат
какой именно break работает неверно - в восьмой строке или в десятой?
Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4
В 8 строке.
В 8 строке.
и как именно "неверно"? - старайтесь писать чуть более развернуто. чтоб мне не приходилось переспрашивать...
Может для начала разобраться count ?
Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен 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Результат
вы явно не чистите buffer между сериями, у вас там лежат старые данные.
И во-вторых, если считано менее 14 байт - значит пакет считан не полностью и его нужно отбрасывать
Вы правы, буфер я не чистил.
#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 мс
Лишних данных не прилетает
Вы правы, буфер я не чистил.
добавьте, а то в этом коде очистки буфера опять нет.
#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Вконце
Результат:
Считывает правильно, без лишних байт, задержку оставил 50 мс.
Сейчас всё верно?
И сразу вопрос касаемый контрольной суммы:
В даташите должна быть формула подсчета контрольной суммы.
В даташите должна быть формула подсчета контрольной суммы.
В даташите на что? На тип карты?
37 35 30 30 38 33 43 43 33 31 надо прогнать по XOR
даже близко нет :)
Это последовательный XOR десяти байтов данных пакета. Для вашей карты, с которой мы начали вчера
Данные: 75 00 83 CC 31
CRC = 0x75 xor 0x00 xor 0x83 xor 0xCC xor 0x31 = 0xOB
Пример из даташита:
Example: card number: 62E3086CED
CHECKSUM: (62H) XOR (E3H) XOR (08H) XOR (6CH) XOR (EDH)=08H
b707 пишете 10 ти, а суммируете 5 ?
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 цифр
ИМХО надо считать 10 пересылаемых байт - ошибка то возникает в момент передачи
А так как формула подсчета простая - результат не меняется ...
ИМХО надо считать 10 пересылаемых байт - ошибка то возникает в момент передачи
надо считать так, как считает модуль :) иначе CRC не совпадет
В том то и дело что CRC совпадает :-)
А так как формула подсчета простая - результат не меняется ...
Уверены?
0x37 xor 0x35 = 0x75 ? :)
37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B
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]; .....Такая логика?
В том то и дело что CRC совпадает :-)
проверьте
Так проверил как раз - 37 35 30 30 38 33 43 43 33 31 через XOR дают 0x0B
Сижу вот чешу репу - как под это математику подвести ...
Так проверил как раз - 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 - значит считать надо вашим методом.
Почему такой пример в даташите? - фиг знает
Что сдерживает от подсчета 10 байт ? (как указано в даташите) :-))
САМ В ШОКЕ !!!
Что сдерживает от подсчета 10 байт ? (как указано в даташите) :-))
ответил пока вы писали :)
Я с вами не спорю, согласен метод расчета нужно использовать ваш
Каким образом сравнивать две переменных summa и SRC ?
Каким образом сравнивать две переменных summa и SRC ?
преобразовать строку summa в число по аналогии со всеми остальными значениями?
Шарик, вы уже начинаете на шею садится. не пора своей головой думать? :)
Это преобразование у меня изначально есть
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");Для первой карты условие работает
Получается надо все таки считать CRC по пяти байтам после конвертации.
0x75 xor 0x00 xor 0x83 xor 0xCB xor 0xBE = 0x83 (131)
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("");Получается надо все таки считать 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 байт.Как?
Мне нужно из 10 байт сделать 5 байт.Как?
так же как вы из массива summa делаете decimal_sum
Мне нужно из 10 байт сделать 5 байт.Как?
так же как вы из массива summa делаете decimal_sum
Получаю 75, а надо 0x75? чтобы записать в массив crc[0]
bytecrc[]={0x75,0x00,0x83,0xCB,0xBE};Получаю 75, а надо 0x75? чтобы записать в массив crc[0]
bytecrc[]={0x75,0x00,0x83,0xCB,0xBE};внимательно сравните этот код и код получения decimal_summ из #87.
Шарик, уже одни и те же вопросы по кругу задаете. Как составить число из символьного массива - вам Командир рассказал на прошлой странице. Похоже. он это сделал зря. надо было заставить вас самому решить эту задачу. а то у вас ничего в голове не отложилось...
Не понимаю...
Имею массив 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("")ну это уже вообще никуда не годится
сами подумайте - t у вас описан как char t[3] - то есть массив из трех элементов. crc[0] - это один байт.
А дальше в строке 7 вы пытаетесь их присваивать друг другу...
Смотрите на код #87, думайте
тоже бред получается
тоже бред получается
а так:
Так и думал что речь о 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];