Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> modbus crc16 & boost::crc, что не пойму как заюзать функцию 
V
    Опции темы
chaos
Дата 2.4.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



День добрый!
Есть вот функция подсчета CRC
Код

unsigned short crc16(const char *data, unsigned short data_len)
{
    unsigned char crc_hi = 0xFF;
    unsigned char crc_lo = 0xFF;

    static unsigned char pre_crc_lo[] = {
            0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
            0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
            0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
            0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
            0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
            0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
            0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
            0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
            0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
            0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
            0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
            0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
            0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
            0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
            0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
            0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
            0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
            0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
            0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
            0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
            0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
            0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
            0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
            0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
            0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
            0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    };

    static unsigned char pre_crc_hi[] = {
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    };

    unsigned char index = 0;
    while (data_len--) {
        index = crc_hi ^ (unsigned char)(*data++);

        crc_hi = crc_lo ^ pre_crc_hi[index];
        crc_lo = pre_crc_lo[index];
    }

    return (crc_hi << 8 | crc_lo);
}



все работает нормально.
Лазая по бусту заметил что там есть библа для расчета CRC. ну думаю дай опробую

Код

//функция сверху
cout << hex << crc16("hello", 5) << endl;

//boost
boost::crc_basic<16> crc(0xA001, 0xFFFF, 0, false, false);
crc.process_bytes("hello", 5);
cout << hex << crc.checksum() << endl;


вижу что результат не совпадает :(
и чото не совсем понимаю почему, вроде полином для модбаса используется A001 и начальное значение FFFF

В где может быть собака зарыта?


Заранее благодарен!
PM WWW   Вверх
mrbrooks
Дата 2.4.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



chaos, посмотри здесь. Делал по образу и подобию. Все ок   smile



Это сообщение отредактировал(а) mrbrooks - 2.4.2009, 19:06
PM MAIL   Вверх
chaos
Дата 3.4.2009, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



mrbrooks, ага, посмотрел и доку бустовскую почитал, но чот не понимаю :(
PM WWW   Вверх
xvr
Дата 3.4.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Попробуй разные последние параметры в шаблоне (2 последних). Еще можно попробовать развернуть полином (8005)
Всего 8 вариантов  smile 
PM MAIL   Вверх
chaos
Дата 3.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(xvr @ 3.4.2009,  13:50)
Попробуй разные последние параметры в шаблоне (2 последних). Еще можно попробовать развернуть полином (8005)
Всего 8 вариантов  smile

1. пробовал - не помогло smile
2. откуда циферка 8005? smile
PM WWW   Вверх
xvr
Дата 3.4.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(chaos @ 3.4.2009,  20:08)
Цитата(xvr @ 3.4.2009,  13:50)
Попробуй разные последние параметры в шаблоне (2 последних). Еще можно попробовать развернуть полином (8005)
Всего 8 вариантов  smile

1. пробовал - не помогло smile
2. откуда циферка 8005? smile

Побитно развернутое A001

PM MAIL   Вверх
chaos
Дата 5.4.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



xvr, то что нужно

Код

boost::crc_optimal<16, 0x8005, 0xFFFF, 0, true, true> crc;
crc.process_bytes("hello", 5);
cout << hex << crc.checksum() << endl;


работает! Спасибо!
PM WWW   Вверх
mrbrooks
Дата 6.4.2009, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(xvr @  3.4.2009,  21:04 Найти цитируемый пост)
Побитно развернутое A001

Камрад, но как ты до этого догадался?  smile 
PM MAIL   Вверх
xvr
Дата 6.4.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mrbrooks @ 6.4.2009,  08:05)
Цитата(xvr @  3.4.2009,  21:04 Найти цитируемый пост)
Побитно развернутое A001

Камрад, но как ты до этого догадался?  smile

В смысле? Как догадался что 8005 это побитно развернутое A001? Или что его вообще развернуть надо?
Первое вычислил (написал битики на бумажке и прочел из справа налево). Второе понял исходя из того, что разные имплементации CRC делают сдвиговый регистр сдвигая данные влево или вправо. Соответственно биты в этом регистре будут считаться либо справа (с MSB) либо слева (LSB). А полином должен быть подан в порядке следования битов. Поэтому иногда его записывают с LSB, иногда с MSB. И не всегда это совпадает с имплементацией собственно регистра  smile 
PM MAIL   Вверх
mrbrooks
Дата 6.4.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(xvr @  6.4.2009,  10:32 Найти цитируемый пост)
Как догадался что 8005 это побитно развернутое A001?

ы.

Цитата(xvr @  6.4.2009,  10:32 Найти цитируемый пост)
Или что его вообще развернуть надо?

 smile 

Цитата(xvr @  6.4.2009,  10:32 Найти цитируемый пост)
Второе понял исходя из того, что разные имплементации CRC делают сдвиговый регистр сдвигая данные влево или вправо. Соответственно биты в этом регистре будут считаться либо справа (с MSB) либо слева (LSB). А полином должен быть подан в порядке следования битов. Поэтому иногда его записывают с LSB, иногда с MSB. И не всегда это совпадает с имплементацией собственно регистра  


Прекрасно. За это можно и по репе. 

PM MAIL   Вверх
mes
Дата 6.4.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mrbrooks @  6.4.2009,  09:47 Найти цитируемый пост)
Прекрасно. За это можно и по репе. 

 smile звучит устрашаюше !  smile 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.9.2010, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

чтоб не писать такое -
Цитата(chaos @  5.4.2009,  10:46 Найти цитируемый пост)
boost::crc_optimal<16, 0x8005, 0xFFFF, 0, true, true>


есть предефайненые типы: boost::crc_32_type, boost::crc_16_type smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.