1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
|
|
1 | |
Расчет контрольной суммы03.05.2017, 22:36. Показов 13559. Ответов 7
Метки нет (Все метки)
Правильно ли я понимаю задание?
Настройки 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
|
03.05.2017, 22:36 | |
Ответы с готовыми решениями:
7
Код по алгоритму. Расчет контрольной суммы Проверка контрольной суммы Вычисление 8-и битных контрольной суммы Проверка контрольной суммы crc8 |
04.05.2017, 06:17 | 2 |
vkgorod, да, при отправке пакета в устройство контрольную суммы рассчитываете вы, а оно рассчитывает снова и проверяет присланное вами. При отправке на ПК рассчитывает устройство, а вы рассчитваете снова и сверяетесь с присланной.
Покажите пару примеров рабочих пакетов.
0
|
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
|
|||||||||||
05.05.2017, 19:55 [ТС] | 3 | ||||||||||
Правильно ли я составил запрос?
Вопрос как его подставлять? Так: { 0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x01, 0x80 ,108 } или переводить в 16-ую СС - 0x... Если crc будет равно crc = 503, то не потеряю ли я старшие байты? В таком случае, как поправить строки?
0
|
05.05.2017, 21:03 | 4 | |||||
В 16-ричную переводить нет нужды.
Попробуйте так:
0x100 - value - дополнение до нуля.Покажите скрин описания протокола из руководства. Ага, нашёл. Повторяю: добудьте пример пакетов обмена между работающим ПО и прибором. Тут что-то не сходится
0
|
1 / 1 / 1
Регистрация: 22.02.2017
Сообщений: 35
|
|||||||||||
05.05.2017, 21:21 [ТС] | 5 | ||||||||||
Т.е. надо еще анализировать crc:
если больше 255
0
|
05.05.2017, 21:29 | 6 |
vkgorod, нет, не надо ничего анализировать.
Нашёл пример такого же по описанию протокола, и там простая инверсия суммы, как в моём коде выше сейчас Расчет контрольной суммы Но в литературе дополнением до нуля (по модулю 256) числа A называется такое число B, что (A + B) & 0xff == 0. Или я что-то не понимаю, или составители протокола врут... Добавлено через 6 минут И вот ещё пример, где дополнение до нуля именно по литературе: РЭ на Весы электронные настольные общего назначения МК_А А вот пример теплосчётчика ТЭМ-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 Тогда так:
Так:
0
|
06.05.2017, 07:39 | 8 |
vkgorod, так, без или.
2 встрока кода в 4 сообщении, на все случаи.
0
|
06.05.2017, 07:39 | |
06.05.2017, 07:39 | |
Помогаю со студенческими работами здесь
8
Проверка контрольной суммы РНН Расчета контрольной суммы MD5 (хеширование) Вычисление контрольной суммы файлов в отдельных потоках Передача данных по COM-порту. Подсчет контрольной суммы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |