crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в [РЕШЕНО]CRC16 для Modbus
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
larry Дата 18.11.2017, 9:30
  Передавал ввиде QByteArray, сделал как QVector<quint8>, то все правильно считает. Спасибо
larry Дата 18.11.2017, 8:38
  Спасибо большое за проверку. Буду проверять где лохонулся....тоже пришел к такому варианту, т.к. уже перелопатил много вариантов.
Iron Bug Дата 17.11.2017, 23:30
  алгоритм верный. я даже проверила по-быстрому. всё правильно он считает. может, ты ему данные как-то неправильно скармливаешь?

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <memory.h>

uint16_t crc(uint8_t *data, uint8_t size)
{
        uint16_t pos;
        uint8_t i;
        uint16_t crc = 0xFFFF;

        for (pos = 0; pos < size; pos++)
        {
                crc ^= (uint16_t)data[pos];          // XOR byte into least sig. byte of crc

                for (uint8_t i = 8; i != 0; i--)
                {    // Loop over each bit
                        if ((crc & 0x0001) != 0)
                        {      // If the LSB is set
                                crc >>= 1;                    // Shift right and XOR 0xA001
                                crc ^= 0xA001;
                        }
                else                            // Else LSB is not set
                        crc >>= 1;                    // Just shift right
                }
        }
        // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
        return crc;
}

void convert(const char *src, uint8_t **dst, size_t *dst_size)
{
        size_t i;
        *dst_size = strlen(src)/2;
        *dst = (uint8_t*)malloc(*dst_size);

        for(i=0; i<*dst_size; i++) {
                sscanf(src+i*2, "%02x", *dst+i);
        }
}

void print_crc(const char *data)
{
        uint8_t *value;
        size_t size;
        size_t i;
        uint16_t val_crc;

        convert(data,&value,&size);

        for(i=0; i<size; i++)
                printf("%02X",value[i]);
        printf("\n");

        val_crc = crc(value,size);
        printf("0x%04X\n",val_crc);

        free(value);
}

int main()
{
        print_crc("01040040000a");
        print_crc("0104143a11e6ee3b16c44d39e24257381730ba3d862437");
        return 0;
}
larry Дата 17.11.2017, 21:55
  Добрый день, форумчане.
Возник вопрос по расчету контрольной суммы для modbus. Нашел такую функцию:

quint16 crc(QByteArray& data, quint8 size)
{
    uint crc = 0xFFFF;
    
    for (int pos = 0; pos < size; pos++)
    {
        crc ^= (quint16)data.at(pos);          // XOR byte into least sig. byte of crc
        
        for (int i = 8; i != 0; i--) 
        {    // Loop over each bit
            if ((crc & 0x0001) != 0) 
            {      // If the LSB is set
                crc >>= 1;                    // Shift right and XOR 0xA001
                crc ^= 0xA001;
            }
            else                            // Else LSB is not set
                crc >>= 1;                    // Just shift right
        }
    }
    // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
    return crc;
}


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

// crc = 71D9
    const char* data = "01040040000a";


и функция возвращает результат, который закоментирован (в калькуляторе тоже самое, т.е. все верно).

Получаю ответ на этот запрос:

// crc = D0AE
const char* data = "0104143a11e6ee3b16c44d39e24257381730ba3d862437";


но расчет контрольной суммы не совпадает...по калькулятору совпадает как в комментарии....

В чем может быть трабла?
Спасибо.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 29.7.2025, 1:08