Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/75: Рейтинг темы: голосов - 75, средняя оценка - 4.63
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
1

Расчет контрольной суммы

03.05.2017, 22:36. Показов 13559. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильно ли я понимаю задание?

Настройки com порта стандартные: 9600, 1 стартовый бит, 8 бит данных, 1 стоповый бит, без бита четности.
Контрольная сумма посылаемого/принимаемого пакета рассчитывается как CS = NOT (B1+B2+B3+…+BN),
где B1…BN - последовательность байт пакета, исключая байт контрольной суммы, NOT – операция побитного логического «НЕ».
*Контрольная сумма (дополнение до нуля)

Вопрос1. Если я правильно понимаю складываем все байты(кроме байта контрольной суммы) и делается операция
логического НЕ. Тогда, что значит дополнение до 0?

Вопрос2. Как все это работает? Поправьте меня.В моем случае есть ведущее устройство (компьютер) и ведомое (теплосчетчик).
Ведущее устройство (компьютер посылает запрос):

Кликните здесь для просмотра всего текста

Посылка «ведущего» устройства
Байт Обозначение Пример Описание
0 SIG 55 Признак начала пакета;
1 ADDR 01 Сетевой адрес ведомого устройства;
2 !ADDR FE Инверсное значение сетевого адреса;
3 CGRP 0F Группа команд;
4 CMD 01 Чтение памяти таймера 2К
5 LEN 03 Число байт посылаемых данных (3)
6 TADRH 01 Начальный адрес в памяти таймера 2K (старший байт)
7 TADRL 80 Начальный адрес в памяти таймера 2K (младший байт)
8 TLEN 40 Длина считываемого блока данных (1..64 байт)
9 CS Контрольная сумма (дополнение до нуля)

Делаю запрос типа byte[] zapros = new byte[] { 0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x01, 0x80, контрольная сумма
подсчитанная по алгоритму}, 9-ый байт рассчитываю как NOT(55+01+FE+0F+01+03+01+80+40) и полученное число,например, 27 помещаю 9-ым байтом 0x27.После отправки получаю пакет от ведомого устройства.

Ответ «ведомого» устройства
Байт Обозначение Пример Описание
0 SIG AA Признак начала пакета
1 ADDR 01 Сетевой адрес устройства
2 !ADDR FE Инверсное значение сетевого адреса
3 CGRP 0F Группа команд
4 CMD 01 Чтение памяти таймера 2К
5 LEN 40 Число байт посылаемых данных (равно полю TLEN в посылке ведущего)
6 DATA Данные
… DATA
5+LEN CS Контрольная сумма (дополнение до нуля)

Контрольную сумму ведомое устройство считает само? А я должен проверить ее? Если совпадает пакет принимается.
Если не совпадает, шлем новый запрос. Вот так я это понимаю.
Может кто поможет примером кода? Настройки порта делать умею.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2017, 22:36
Ответы с готовыми решениями:

Код по алгоритму. Расчет контрольной суммы
Помогите написать код по этому алгоритму. 1) Пользователь может выбрать ввод 8-ми или на...

Проверка контрольной суммы
нашел код для проверки контрольной суммы. Какие действия он выполняет, если пришли "битые данные",...

Вычисление 8-и битных контрольной суммы
Доброго времени суток господа! Нужна ваша помощь. Есть функция на Си для вычисления 8-и битных...

Проверка контрольной суммы crc8
народ, подскажите как сделать проверку контрольной суммы допустим поступают байты: 170 7 0 0 7 102...

7
Эксперт .NET
10557 / 6484 / 1503
Регистрация: 25.05.2015
Сообщений: 19,644
Записей в блоге: 14
04.05.2017, 06:17 2
vkgorod, да, при отправке пакета в устройство контрольную суммы рассчитываете вы, а оно рассчитывает снова и проверяет присланное вами. При отправке на ПК рассчитывает устройство, а вы рассчитваете снова и сверяетесь с присланной.
Покажите пару примеров рабочих пакетов.
0
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
05.05.2017, 19:55  [ТС] 3
Правильно ли я составил запрос?
C#
1
2
3
4
public List<byte> zap = new List<byte> { 0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x01, 0x80 };
int res = (zap[1] + zap[2] + zap[3] + zap[4] + zap[5] + zap[6] + zap[7]); 
byte crc = (byte)(~res & 0xFF);
zap.Add(crc);
9-ый байт crc =108;
Вопрос как его подставлять? Так:
{ 0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x01, 0x80 ,108 }
или переводить в 16-ую СС - 0x...
Если crc будет равно crc = 503, то не потеряю ли я старшие байты? В таком случае, как поправить строки?
C#
1
2
byte crc = (byte)(~res & 0xFF);
zap.Add(crc);
0
Эксперт .NET
10557 / 6484 / 1503
Регистрация: 25.05.2015
Сообщений: 19,644
Записей в блоге: 14
05.05.2017, 21:03 4
В 16-ричную переводить нет нужды.
Попробуйте так:
C#
1
2
3
List<byte> packet = new List<byte> { 0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x01, 0x80 };
byte checksum = (byte)((packet.Sum() & 0xff) ^ 0xff)
packet.Add(checksum);
И ещё 0x100 - value - дополнение до нуля.
Покажите скрин описания протокола из руководства.

Ага, нашёл.
Расчет контрольной суммы

Повторяю: добудьте пример пакетов обмена между работающим ПО и прибором.
Тут что-то не сходится
0
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
05.05.2017, 21:21  [ТС] 5
Т.е. надо еще анализировать crc:
если больше 255
C#
1
byte checksum = (byte)(0x100 - (packet.Sum() & 0xff));
если меньше 255
C#
1
byte checksum = (byte)(packet.Sum() & 0xff);
Это чтобы один байт в коллекцию добавить нужно такие извращения, может попроще, код есть?
0
Эксперт .NET
10557 / 6484 / 1503
Регистрация: 25.05.2015
Сообщений: 19,644
Записей в блоге: 14
05.05.2017, 21:29 6
vkgorod, нет, не надо ничего анализировать.
Нашёл пример такого же по описанию протокола, и там простая инверсия суммы, как в моём коде выше сейчас Расчет контрольной суммы
Но в литературе дополнением до нуля (по модулю 256) числа A называется такое число B, что (A + B) & 0xff == 0.
Или я что-то не понимаю, или составители протокола врут...

Добавлено через 6 минут
И вот ещё пример, где дополнение до нуля именно по литературе:

РЭ на Весы электронные настольные общего назначения МК_А
Контрольная сумма рассчитывается, как дополнение до нуля суммы всех байт посылки. Значение контрольной суммы байтовое. Старшие байты суммы отбрасываются.

Пример:
Посылка: 0x41 0x10 0x00 0x43;
Рассчитанная контрольная сумма для посылки: 0x6C;
Посылка для передачи весам: 0x41 0x10 0x00 0x43 0x6C.
0x41 + 0x10 + 0x43 = 0x94. 0x100 - 0x94 = 0x6C.

А вот пример теплосчётчика ТЭМ-104, с описанием протокола как у вас:
Расчет контрольной суммы

0x55 + 0x01 + 0xfe = 0x154. NOT (0x154 & 0xff) = 0xAB
0
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
05.05.2017, 23:18  [ТС] 7
Rius, нет времени пока проверить обмен между компом и теплосчетчиком программой ComPort Toolkit.
Пока просчитываю, каркас программы:
- отправка запроса;
- считывание порта в отдельном потоке;
- применение таймера в программе (3 образцовых расходомера) и данные надо считывать каждую секунду или чаще, причем надо определиться какой расходомер активный;
- идентификация устройств по Rs-485;
- реализация старт-стопа программно;
Вот только малая часть вопросов, которые я пытаюсь понять. Есть протокол обмена и мое желание плюс интернет.

Добавлено через 1 час 46 минут
Это мой случай:
0x55 + 0x01 + 0xfe = 0x54. NOT (0x54 & 0xff) = 0xAB
Тогда так:
C#
1
byte crc = (byte)(~res & 0xff);
Остался мой второй вопрос, если crc > 255
Так:
C#
1
byte crc = (byte)(~res & 0xff);
или так:
C#
1
byte crc = (byte)(0x100 - ~res & 0xff);
0
Эксперт .NET
10557 / 6484 / 1503
Регистрация: 25.05.2015
Сообщений: 19,644
Записей в блоге: 14
06.05.2017, 07:39 8
vkgorod, так, без или.
2 встрока кода в 4 сообщении, на все случаи.
0
06.05.2017, 07:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2017, 07:39
Помогаю со студенческими работами здесь

Проверка контрольной суммы РНН
Добрый день, уважаемые читатели форума. Суть вопроса: РНН представляет собой 12-тиразрядное...

Расчета контрольной суммы MD5 (хеширование)
Помогите с процедурой для , ___ где вопросительные знаки нужно вставить процедуру:wall: ...

Вычисление контрольной суммы файлов в отдельных потоках
Помогите,пожалуйста,искал в интернете,что то подобное,толком ничего не нашел. само задание:...

Передача данных по COM-порту. Подсчет контрольной суммы
Здравствуйте! помогите перевести с языка ПАСКАЛЬ на C# Способ подсчета контрольной суммы. 1. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru