Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен 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 только каждый второй байт
Результат
какой именно break работает неверно - в восьмой строке или в десятой?
Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4
В 8 строке.
В 8 строке.
и как именно "неверно"? - старайтесь писать чуть более развернуто. чтоб мне не приходилось переспрашивать...
Может для начала разобраться count ?
Шарик, пытайтесь проходить по строчкам своего же кода вместо компьютера. У вас в этом коде проблема с индексом. То. что код работает - не более чем случайность. Подумайте. чему равен count в строке 4
Результат
вы явно не чистите buffer между сериями, у вас там лежат старые данные.
И во-вторых, если считано менее 14 байт - значит пакет считан не полностью и его нужно отбрасывать
Вы правы, буфер я не чистил.
Добавил очистку while (RDM6300.available())RDM6300.read();
И задержку сделал 50 мс
Лишних данных не прилетает
Вы правы, буфер я не чистил.
добавьте, а то в этом коде очистки буфера опять нет.
Вконце
Результат:
Считывает правильно, без лишних байт, задержку оставил 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
Такая логика?
В том то и дело что 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 в число по аналогии со всеми остальными значениями?
Шарик, вы уже начинаете на шею садится. не пора своей головой думать? :)
Это преобразование у меня изначально есть
Для первой карты условие работает
Получается надо все таки считать CRC по пяти байтам после конвертации.
0x75 xor 0x00 xor 0x83 xor 0xCB xor 0xBE = 0x83 (131)
Получается надо все таки считать CRC по пяти байтам после конвертации.
0x75 xor 0x00 xor 0x83 xor 0xCB xor 0xBE = 0x83 (131)
Тяжко у меня с байтами...
Так понятно, получаю 131
Мне нужно из 10 байт сделать 5 байт.Как?
Мне нужно из 10 байт сделать 5 байт.Как?
так же как вы из массива summa делаете decimal_sum
Мне нужно из 10 байт сделать 5 байт.Как?
так же как вы из массива summa делаете decimal_sum
Получаю 75, а надо 0x75? чтобы записать в массив crc[0]
byte
crc[]={0x75,0x00,0x83,0xCB,0xBE};
Получаю 75, а надо 0x75? чтобы записать в массив crc[0]
byte
crc[]={0x75,0x00,0x83,0xCB,0xBE};
внимательно сравните этот код и код получения decimal_summ из #87.
Шарик, уже одни и те же вопросы по кругу задаете. Как составить число из символьного массива - вам Командир рассказал на прошлой странице. Похоже. он это сделал зря. надо было заставить вас самому решить эту задачу. а то у вас ничего в голове не отложилось...
Не понимаю...
Имею массив 5 байт. Заполняю первый элемент массива = t
Результат на выходе неверный
ну это уже вообще никуда не годится
сами подумайте - t у вас описан как char t[3] - то есть массив из трех элементов. crc[0] - это один байт.
А дальше в строке 7 вы пытаетесь их присваивать друг другу...
Смотрите на код #87, думайте
тоже бред получается
тоже бред получается
а так:
Так и думал что речь о 42 и 45 постах.
Получается что и здесь у меня неправильно
обязательно нужно добавлять
seriia[4]=0;
nomer[4]=0;
Правильно?
почему unsigned char t[3]; а не char t[3];