Показано с 1 по 3 из 3

Тема: сетевой протокол овен по Rs-485. рассчет Crc.

  1. #1

    Exclamation сетевой протокол овен по Rs-485. рассчет Crc.

    Всем доброго времени суток. При расчете CRC сталкнулся вот с какой ситуацией:
    1. Взял из примера - http://www.softelectro.ru/8_1.html, данные чтобы рассчитать ее CRC и проверить правильность алгоритма.
    Брал формулу расчета CRC тут - http://www.owen.ru/uploads/type_prot_owen.zip, из пункта 4.5, в тогде, функция получилась следующая :
    Код:
    //Âû÷èñëåíèå CRC
    UINT Hash(USINT ArrayData[120],INT Len)
    {
    	INT j,i;
    	UINT CRC;
    	USINT Byte;
    	CRC = 0x0000;
    	for (j = 0;j < Len;j++)
    	{
    		Byte = ArrayData[j] << 1 ;
    		for (i = 0; i < 7; i++, Byte <<= 1)
    		{
    			if (  ( Byte ^ (CRC>>8) ) & 0x80  )
    			{
    				CRC <<= 1;  CRC ^= 0x8F57;
    			}
    			else  CRC <<= 1;
    		}
    	}
    	return CRC;
    }
    Код:
    Byte = ArrayData[j] << 1 ;
    - данная строка, получалась, так как в примере описанном ниже в п.4.5, входные значения сдвигались влево.

    После чего пробовал высчитать контрольную, сумму для -
    Код:
    0x04 0x10 0xC1 0x73
    После расчета получалось -
    Код:
    0xBD 0xEA
    вместо -
    Код:
    0x79 0x1E
    После, этого перелазил форум и нашел данную схожую тему - http://www.owen.ru/forum/showthread....1%F7%E5%F2+CRC, при проверки его контрольной суммы, она совпадала с его рассчитанной, но не с той которая должна была получиться.
    После этого, в той же теме привлек мое внимание 3 пост - http://www.owen.ru/forum/showpost.ph...74&postcount=3, с рассчетом CRC на QT, где не было просто первоначального левого сдвига и старшим битом считался не 7, как написано было в оф.описании протокола, а 8 бит, после не хитрой корректировки, получилось следующее :
    Код:
    UINT Hash(USINT ArrayData[120],INT Len)
    {
    	INT j,i;
    	UINT CRC;
    	USINT Byte;
    	CRC = 0x0000;
    	for (j = 0;j < Len;j++)
    	{
    		Byte = ArrayData[j] ;
    		for (i = 0; i < 8; i++, Byte <<= 1)
    		{
    			if (  ( Byte ^ (CRC>>8) ) & 0x80  )
    			{
    				CRC <<= 1;  CRC ^= 0x8F57;
    			}
    			else  CRC <<= 1;
    		}
    	}
    	return CRC;
    }
    И о чудо, контрольные суммы сошлись для описанных выше примеров.

    После всего, этого возникает вопрос - это ошибка описания протокола или я что-то не правильно понял и делал?

  2. #2

  3. #3

    По умолчанию

    Спасибо, за ответ, все сомнения развеяны

Похожие темы

  1. Протокол ОВЕН
    от O_o в разделе Помощь Разработчикам
    Ответов: 3
    Последнее сообщение: 04.08.2011, 14:04
  2. протокол обмена овен
    от Михайлов Сергей в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 08.02.2011, 17:06
  3. сетевой протокол овен по Rs-485. рассчет Crc.
    от Танец Ветра в разделе Сетевые технологии
    Ответов: 6
    Последнее сообщение: 19.10.2010, 14:02
  4. протокол овен на .net (c#)
    от ToniPizecato в разделе Помощь Разработчикам
    Ответов: 6
    Последнее сообщение: 28.12.2009, 12:02
  5. Протокол ОВЕН и Debug RS-232
    от Vyacheslav в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 03.02.2009, 22:00

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •