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

 
 
> И снова про CRC, Что надо сказать IAR-у, чтобы он считал CRC как для пакетов MODBUS?
spf
сообщение Dec 12 2007, 07:05
Сообщение #1


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Привет!

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

В боевом коде программы имеются функции по работе с пакетами Modbus (вычисление CRC).
Заставить IAR посчитать CRC так же, как считает проверенная функция вычисления CRC для Modbus
не удалось. Может кто-то это прошел?

Не хотелось бы иметь две таблицы для расчета CRC.

PS: IAR 3.42 (MSP430)


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Dec 13 2007, 10:36
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(spf @ Dec 13 2007, 05:51) *
Линкеру говорим:

-Hff
-J2,crc16,,Flash_CRC,INFO=(CODE)4000-ffff

Линкер должен считать crc не всей памяти, а от её начала до месторасположения CRC.
То есть сегмент INFO у вас должен находится в конце памяти:
Код
-Z(CODE)INFO#FFFF

а строка вычисления CRC совсем другая, там куча ошибок. Примерно так:
Код
-J2,crc=A001,m,Flash_CRC,INFO,,FFFF=(CODE)4000-FFFD

да и то я сомневаюсь, что получится, посколько там есть еще какая то лажа, с которой я ещё не разобрался. Дайте пример CRC: несколько байт и верную сумму, тогда когда доберусь до работы, попробую.

Цитата(rezident @ Dec 13 2007, 00:26) *
CRC16 ModBus вместе полиномом, таблицей и примером реализации на Си имеются в спецификации ModBus over serial line.
Выше я уже привел пример алгоритма расчета CRC16 именно с тем полиномом, который используется в ModBus. Что же вам еще нужно-то? Помогайте

А вы бы товарищ, лучше бы дали несколько конкретных цифр вместо ёрничанья. Или все должны знать алгоритм расчета CRC Modbus? В том что вы дали не ни слова о Modbus.
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 13 2007, 11:56
Сообщение #3


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Baser @ Dec 13 2007, 15:36) *
Линкер должен считать crc не всей памяти, а от её начала до месторасположения CRC.

Попрошу не отдаляться от темы.
У меня CRC лежит именно там, где мне это надо. Не об этом речь. Пример приведен из рабочего вариант для простого CRC16(CCITT), в нем нет ошибок.


Что только не предлагают, но все не по теме...

Вот пример кода для расчета CRC для MODBUS
Код
unsigned int Crc16AddBlock(unsigned int cur_crc, unsigned char *p_data, unsigned int data_len)
{
        do
        {
            unsigned int   i = 8;    

            cur_crc = cur_crc ^ *p_data++;

            do
            {
                if (0x0001 & cur_crc)
                {
                    cur_crc >>= 1;    
                    cur_crc  ^=  0xA001;
                }
                else                          
                {
                    cur_crc >>= 1;      
                }
            }
            while (--i);
        }
        while (--data_len);
    return  cur_crc;
}


PS: только не надо ёрничанья


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 13 2007, 13:28
Сообщение #4


Гуру
******

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



Цитата(spf @ Dec 13 2007, 13:56) *
Попрошу не отдаляться от темы.
Прошу извинить. Вот еще один вариант быстрого вычисления, хотя кажется у singlskv вариант быстрее:
Код
uint16_t CRC_MODBUS(uint16_t crc, uint8_t byte)
{
    byte ^= crc;
    crc = crc >> 8;

    if(byte & (1 << 0)) crc ^= 0xC0C1;
    if(byte & (1 << 1)) crc ^= 0xC181;
    if(byte & (1 << 2)) crc ^= 0xC301;
    if(byte & (1 << 3)) crc ^= 0xC601;
    if(byte & (1 << 4)) crc ^= 0xCC01;
    if(byte & (1 << 5)) crc ^= 0xD801;
    if(byte & (1 << 6)) crc ^= 0xF001;
    if(byte & (1 << 7)) crc ^= 0xA001;
    return crc;
}
Прогнал на строке из нескольких байтов, вроде работает.


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 10:10
Рейтинг@Mail.ru


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