Форум программистов, компьютерный форум, киберфорум
АСУ ТП, промэлектроника
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/92: Рейтинг темы: голосов - 92, средняя оценка - 4.99
barcode
1

Расчёт MODBUS CRC

15.03.2012, 14:17. Показов 18034. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не компилируется код:
9: ошибка: invalid type argument of 'unary *'
14: ошибка: return-statement with a value, in function returning 'void'
Сам код взят из официального описания протокола MODBUS

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
void crc_calculating(unsigned char puchMsg, unsigned short usDataLen)   /*##Расчёт контрольной суммы##*/
{
    {
        unsigned char uchCRCHi = 0xFF ;             /* Инициализация последнего байта CRC  */
        unsigned char uchCRCLo = 0xFF ;             /* Инициализация первого байта CRC   */
        unsigned uIndex ;                           /* will index into CRC lookup table  */
        while (usDataLen--)                         /* pass through message buffer  */
        {
        uIndex = uchCRCHi ^ *puchMsg++ ;            /* Расчёт CRC */
        uchCRCLo = uchCRCLo ^ auchCRCHi[uIndex] ;
        uchCRCHi = auchCRCLo[uIndex] ;
        }
        return (uchCRCHi << 8 | uchCRCLo) ;
 
    /* Table of CRC values for high–order byte */
    static unsigned char auchCRCHi[] = {
    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
    };
    /* Table of CRC values for low–order byte */
    static char auchCRCLo[] = {
    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
    };
    }
}
Укажите пожалуйста на ошибки, и по возможности объясните мне принцип работы кода, сам не понимаю что происходит с 9 по 12 строку. Заранее спасибо.
P.S. первая программа, ногами не бейте пожалуйста.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2012, 14:17
Ответы с готовыми решениями:

Обмен информации с контроллером (расчет CRC)
Доброго времени суток! Для чтения информации с контроллера нужно послать команду типа : 1....

Нет связи между модулем ввода (modbus rtu slave) и программой modbus poll на ноутбуке
Добрый день форумчанам. Сконфигурирован модуль modbus rtu slave в Ovation system. Опыт работы с...

Расчет CRC с полиномом MODBUS
Доброго времени суток! Есть описание протокола счетчика серии СЭТ-4ТМ. Там есть пример на Паскале...

CRC ModBus
Здравствуйте Всем, доброго время суток. Столкнулся с проблемой опроса контроллера с ModBus....

CRC 16 Modbus
Собственно есть алгоритм, в нём старший и младший байт поменяны местами и при вычислении CRC для...

7
Автор FAQ
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
15.03.2012, 14:29 2
судя по той же документации то переменная puchMsg должна быть такой:
C++
1
unsigned char *puchMsg
а у вас не то немного
1
Почетный модератор
11528 / 4323 / 448
Регистрация: 12.06.2008
Сообщений: 12,424
15.03.2012, 15:26 3
А вторая ошибка жалуется, что Вы пытаетесь вернуть значение, при том, что функция объявлена как
C++
1
void crc_calculating
Тогда надо её объявлять как
C++
1
unsigned char crc_calculating
1
18 / 17 / 0
Регистрация: 22.09.2009
Сообщений: 37
15.03.2012, 15:53 4
если вам интересно, если библиотечка libmodbus5. Libmodbus. Библиотека Modbus for Linux, Mac OS X, FreeBSD, QNX and Win32.
Если используете Debian/Ubuntu, она лежит в репозитории Debian Sid http://packages.debian.org/ru/sid/libmodbus5
Очень приятная в обращении
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.03.2012, 15:54 5
Цитата Сообщение от barcode Посмотреть сообщение
void crc_calculating(unsigned char puchMsg, unsigned short usDataLen)
Почувствуйте разницу.
C
1
unsigned int crc_calculating(unsigned char *puchMsg, unsigned short usDataLen)
1
barcode
20.03.2012, 16:47 6
klevv, Не встречал развернутой документации по этой библиотеке?
Конкретно интересует сможет ли она только рассчитывать контрольную сумму, из уже имеющегося произвольного сообщения.
18 / 17 / 0
Регистрация: 22.09.2009
Сообщений: 37
21.03.2012, 14:26 7
документации отдельно не встречал. в Debian с пакетом libmodbus5-dev идут файлы с короткими примерами (/usr/share/doc/libmodbus5-dev/examples). там все понятно. прикрепил архив с исходниками примеров для тех, у кого не Debian
Вложения
Тип файла: zip examples.zip (16.8 Кб, 158 просмотров)
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
21.03.2012, 16:50 8
Libmodbus. Библиотека Modbus for Linux, Mac OS X, FreeBSD, QNX and Win32
RS-485. Работа с Modbus протоколом...
0
21.03.2012, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2012, 16:50
Помогаю со студенческими работами здесь

Разъясните где не прав: Aduc831, Modbus, CRC-16
В силу своих возможностей пытаюсь прикрутить Modbus на МК ADUC831. Краткий курс дела: -Uart...

расчет crc
del

Расчет CRC
С Наступающим форумчане!!!) подскажите пожалуйста можно ли как-то расcчитать CRC для многобайтового...

Расчет CRC
Доброго времени суток! Прошу помощи знатоков. Нужно рассчитать CRC-16 (полином 8005h,инициализации...

Расчет CRC-32
Всем привет. Я пытаюсь реализовать программу, рассчитывающую CRC-32 методом побитового сдвига для...

Написать расчет CRC
Есть расчет CRC на C++ static const unsigned short crcTab = {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru