Расчет контрольной суммы - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д