powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Расчёт контрольной суммы
9 сообщений из 9, страница 1 из 1
Расчёт контрольной суммы
    #40026753
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Взял готовый алгоритм от разработчика устройства, который высчитывает контрольную сумму пакета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
uint_least16_t __fastcall CRC16w(unsigned char *buf, size_t len)
{
  //	unsigned short crc - любое значение
  //	unsigned char *buf - указатель на начало данных, по которым требуется рассчитать CRC
  //	unsigned short len - длина массива данных, по которым требуется рассчитать CRC (равна параметру "Длина пакета" в командах)
  //	unsigned short CRC16(unsigned short crc, unsigned char *buf, unsigned short len)

	unsigned short bits, k , a, temp;
	unsigned short crc = 0;
	for (k = 0; k < len; k++)
	{
		a = 0;
		temp = (crc>>8)<<8;
		for (bits = 0; bits < 8; bits++)
		{
			if ((temp ^ a) & 0x8000)
				a=(a<<1) ^ 0x1021;
			else
				a<<=1;
			temp<<=1;
		}
		crc=a ^ (crc<<8) ^ (buf[k] & 0xFF);
	}
	return(crc);
}



обращение к нему следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TByteDynArray InData;
		InData.set_length(8);
		TByteDynArray OutData;
		OutData.set_length(8);
		OutData[0] = 0xF8;
		OutData[1] = 0x55;
		OutData[2] = 0xCE;
		OutData[3] = 0x01;
		OutData[4] = 0x00;
		OutData[5] = 0xA0;
		unsigned char bufrd[6];
		for (int i = 0; i < 6; i++) {
			bufrd[i] = OutData[i];
		}
		unsigned short crc = CRC16w(bufrd, 6);
		OutData[6] = crc & 0xFF; //младший байт crc
		OutData[7] = (crc >> 8) & 0xFF; //старший байт crc
	   //	OutData[6] = 0xA0;
	   //	OutData[7] = 0x00;



по контрольной сумме должно выходить 0xA0 и 0x00, но выходит 0x6А и 0x8А

Не могу понять , что не так.
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40026777
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упрости свой вопрос. Пускай у тебя будет тестовый массив из 1 элемента.

Код: plaintext
1.
OutData[0] = 0xF8;



И посчитай чему равна контрольная сумма в этом случае. И отдельно посчитай на бумажке вручную.
Я думаю будет быстро очевидно что не так.
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40026814
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все верно, получается 0x6А и 0x8А.

Классический CRC16 выдает 0x37 и 0xAF

Онлайн калькулятор
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40026821
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73по контрольной сумме должно выходить 0xA0 и 0x00

Судя по этому, у тебя контрольная сумма это байты 4 и 5. Т есть ты считаешь сумму не того
куска данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40027031
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё оказалось просто!

(еще не проверил). Оказывается тут пакет - это не пакет. Это так...
А пакет тут, указывается отдельно внутри. И как я не догадался.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
F8	Заголовок пакета (3 байта)
55
CE
01	Длина пакета (2 байта), считается начиная со следующего байта, не включая CRC
00
A0	Код команды (1 байт)
CRCLo	CRC16 (расчет CRC см. ниже)
CRCHi



"Длина пакета  01 00    где тут 6  ???  1  !!"

Да, где тут 6?
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40027055
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73
... И как я не догадался.
...
Да, где тут 6?

Поздравляю! Только извинись что нас потревожил
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40027068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73Оказывается тут пакет - это не пакет. Это так...

Ну да, кто бы мог подумать, что пакет может состоять из заголовка, данных и контрольной
суммы (их)?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40027070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там выше еще есть ethernet заголовок. Вот такая вот сложная ситуация. Мдя...

Бойтесь абстракций ребята. Они вас обманывают.
...
Рейтинг: 0 / 0
Расчёт контрольной суммы
    #40030684
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача решилась.
В подсчёт контрольной суммы не входили первые 5 байт )))
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Расчёт контрольной суммы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]