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

Узнай цену своей работы

Формулировка задачи:

Правильно ли я понимаю задание? Настройки 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 Контрольная сумма (дополнение до нуля)
Контрольную сумму ведомое устройство считает само? А я должен проверить ее? Если совпадает пакет принимается. Если не совпадает, шлем новый запрос. Вот так я это понимаю.

Может кто поможет примером кода?

Настройки порта делать умею.

Решение задачи: «Расчет контрольной суммы»

textual
Листинг программы
byte crc = (byte)(0x100 - ~res & 0xff);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы