реклама на сайте
подробности

 
 
> CRC-8, не сходиться
kolisnichenko_r
сообщение Feb 19 2010, 14:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482



Здравствуйте!
Начал работу со считывателем PR-01(по работе один один с DS1990A). Есть карточка. Считываю данные, номер совпадает с номером на карточке. Считаю CRC - не совпадает.
Вот функция:
Код
unsigned char Crc8(unsigned char *pcBlock, unsigned char len)
{   unsigned char crc=0xFF;
    unsigned char i;
    while (len--)
    {crc^=*pcBlock++;
     for(i=0;i<8;i++)
     crc=crc&0x80?(crc<<1)^0x31:crc<<1;
    }
    return crc;
}
Вот что я считал с карточки:
[code] mas[0]=0x01;
  mas[1]=0xdf;
  mas[2]=0xd8;
  mas[3]=0x58;
  mas[4]=0x00;
  mas[5]=0x00;
  mas[6]=0x00;
  mas[7]=0x79;//CRC

Использую функцию так:
Код
CRC8=Crc8(mas[0],7);

В результате CRC8=0х95
Что я делаю не так, подтолкните
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Сергей Борщ
сообщение Feb 19 2010, 14:19
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kolisnichenko_r @ Feb 19 2010, 16:03) *
Что я делаю не так, подтолкните
Начальное значение должно быть 0, а не 0xFF.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kolisnichenko_r
сообщение Feb 19 2010, 15:21
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482



Цитата(Сергей Борщ @ Feb 19 2010, 18:19) *
Начальное значение должно быть 0, а не 0xFF.

Спасибо! Сейчас проверю

Заменил на 0х00, получил 0хF5.
Подсчитайте, пожалуйста по точно рабочему алгоритму. Может не правильно считано
Go to the top of the page
 
+Quote Post
UniSoft
сообщение Feb 19 2010, 15:45
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 7-05-05
Из: China, Shenzhen
Пользователь №: 4 812



Цитата(kolisnichenko_r @ Feb 19 2010, 22:03) *
Заменил на 0х00, получил 0хF5.
Подсчитайте, пожалуйста по точно рабочему алгоритму. Может не правильно считано

Считано правильно,
А процедура подсчета у меня так реализована... (хотя фактически это тоже самое, только сдвиг в другую сторону, и соответственно полином перевернут)
Код
unsigned char Crc8(unsigned char *pcBlock, unsigned char len) {
    unsigned char crc=0;
    unsigned char i;

    while (len--) {
        crc^=*pcBlock++;
        for(i=0;i<8;i++)
            crc=crc&1?(crc>>1)^0x8C:crc>>1;
    }
    return crc;
}


и еще, может вызов неверный,
CRC8=Crc8(mas[0],7);
разве не так нужно?
CRC8=Crc8(&mas[0],7); или так: CRC8=Crc8(mas,7);

вкладываю мою программку калькулятор, сам писал для PC, правда на ассемблере...
если конечно кому-то нужно

Сообщение отредактировал UniSoft - Feb 19 2010, 16:37
Причина редактирования: Нарушение п.3.4 Правил форума.

Прикрепленные файлы
Прикрепленный файл  crc8sn.rar ( 5.75 килобайт ) Кол-во скачиваний: 34
 
Go to the top of the page
 
+Quote Post
kolisnichenko_r
сообщение Feb 21 2010, 15:33
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482



Вот спасибо! Получилось с Вашей функцией подсчета. И вызов функции у меня был не правильным, что-то я заработался
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016