Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: расчёт crc16 для весов ТСК-5  (Прочитано 2609 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vvl

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
расчёт crc16 для весов ТСК-5
« : 28 Мая 2009, 12:02:21 »
Добрый день,

 Я использую весы ТСК-5, для связи с ними используется com-порт (Описание - http://www.baltves.ru/?module=articles&id=94). Чтобы весы ответили, нужно сформулировать запрос из четырёх байт:
- сетевой адрес устройства
- байт 55h
- два байта контрольной суммы crc16
 В описании весов сказано(http://baltves.ru/index.php?module=articles&id=94), что если "сетевой адрес равен 0, то посылка имеет вид 000h, 055h, 017h, 05Fh" (почему-то значения записаны именно так - с 0 перед байтом).
 Я отправил запрос на весы (0х00,0х55,0х17,0х5F) и получил от весов правильный ответ.
 Теперь у меня задача использовать весы с сетевым адресом 1, но я не знаю - как рассчитать два последние байта crc16.

 В описании также коротко изложен расчёт crc16:
- crc16 состоит из 2х байтов В1 и B2, начальное значение которых B1=B2=0FFh;
- для каждого байта данных Di производится B1=(B1 xor Di)
- восемь раз сдвигается слово B1B2 на 1 бит в сторону старшего бита B1 и производится B1B2=(B1B2 xor 1021h) каждый раз, когда перед сдвигом старший бит B1=1.

 Я долго гонял нули и единицы, пытаясь понять суть написанного, потом нашёл в Википедии пример расчёта crc16 CCITT (на СИ) с полиномом 0х1021: http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4

Написал на Builder приведённую там программу:

unsigned char *pcBlock = "0x00,0x55";
unsigned short len = 8;
unsigned short crc=0xFFFF;
unsigned short i;

while( len--)
{
  crc ^= *pcBlock++ << 8;
  for(i=0;i<8:i++)
    crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;
}
// вывод crc на builder`e в десятеричном формате
ListBox1->Items->Add(crc);

 Но и в этом алгоритме ожидаемые "0x17,0x5F" не получаются...
 Скажите, где я ошибся или пришлите, пожалуйста, правильный алгоритм расчёта.
« Последнее редактирование: 28 Мая 2009, 12:07:47 от vvl »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: расчёт crc16 для весов ТСК-5
« Ответ #1 : 28 Мая 2009, 14:08:55 »
Кипи книжку по языку Си и прочитай от корки до корки. Вдумчиво.
#include <stdio.h>
#include <stdlib.h>

/*
  Name  : CRC-16 CCITT
  Poly  : 0x1021    x^16 + x^12 + x^5 + 1
  Init  : 0xFFFF
  Revert: false
  XorOut: 0x0000
  Check : 0x29B1 ("123456789")
  MaxLen: 4095 байт (32767 бит) - обнаружение
    одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned short Crc16( unsigned char *pcBlock, unsigned short len )
{
    unsigned short crc = 0xFFFF;
    unsigned char i;

    while( len-- )
    {
        crc ^= *pcBlock++ << 8;

        for( i = 0; i < 8; i++ )
        crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;
    }

    return crc;
}

int main()
{
        unsigned char data[] = { 0x00, 0x55 };
        unsigned short crc;

        crc = Crc16(data, 2);
        printf("%04X\n", crc);
}

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.