crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 29.3.2024, 12:39