1

Тема: Подсчет контрольной суммы. Как эффективнее всего?

Здравствуйте
Подскажите, плиз, в такой ситуации оптимальный путь:

Имеется надобность посылать через UART посылку, в которой из диаграммы будет передаваться число (десятичное), которое принимаемым устройством должно быть отображено на экране цифрами. Посылка состоит из HEX кодов символов ASCII, которые принимаемое устройство само в символы преобразует.

Если я правильно понял, для преобразования десятичного числа в символы нужно воспользоваться блоком "число в строку"

http://i.piccy.info/i9/3aaeac7b25c79fad3d940dd79cc96200/1543161039/27880/1232451/Bezymiannyi.jpghttp://i.piccy.info/a3/2018-11-25-15-50/i9-12794561/469x418-r/i.gif
Но мне нужно десятичное число в шестнадцатиричное преобразовать для пересылки. И таким образом этого не добиться.
Сначала число в строку по основанию 10, потом строку в число по основанию 16? Это сработает?

Но, кроме этого,  посылка должна содержать чек сумму. А значение меняется по результатам работы диаграммы.
Есть какой-то более оптимальный способ для вычисления чексуммы чем банальное XOR всех бит посылки? (их почти три десятка sad )
Спасибо

2

Re: Подсчет контрольной суммы. Как эффективнее всего?

Посылка состоит из HEX кодов символов ASCII, которые принимаемое устройство само в символы преобразует.

Блок "Число в строку" по основанию 10, преобразует именно в ASCII коды символов. То, в какой системе счисления вы видите ASCII коды, зависит только от средства просмотра. Полагаю, что никаких дополнительных преобразований вам не потребуется.

3

Re: Подсчет контрольной суммы. Как эффективнее всего?

Но, кроме этого,  посылка должна содержать чек сумму.

Если алгоритм расчета контрольной суммой не фиксированный, то я бы использовал протокол Modbus RTU: http://wiki.canny.ru/index.php?title=CA … Modbus_RTU

в этом случае, драйвер UART рассчитает с добавит контрольную сумму сам.

Начиная с версии CannyLab 1.35 поддержка Modbus RTU добавлена в драйвер UART контроллера Canny 5 nano.

4

Re: Подсчет контрольной суммы. Как эффективнее всего?

Спасибо, попробовал.


У меня получается так:
30 19 80 1A 35 00 20 20 20 20 20 20 20 2D 24 42 4D 57 24 2D 20 20 20 20 20 20 FE  - без RTU, рабочая посылка. FE - чек сумма. Строка на экране отображается.

30 19 80 1A 35 00 20 20 20 20 20 20 20 2D 24 42 4D 57 24 2D 20 20 20 20 20 9E 62  -  с RTU, нерабочая посылка. 

Длинна сообщения UART - 27 в обоих случаях.

Увеличил длину до 28, в шину шлет такое:
30 19 80 1A 35 00 20 20 20 20 20 20 20 2D 24 42 4D 57 24 2D 20 20 20 20 20 20 E2 70  - rtu (28), все равно не получается.

В описании RTU указано, что чек сумма это два байта. В моей посылке - один. Я так понимаю, проблема в этом. Это как-то можно победить?
Благодарю

5

Re: Подсчет контрольной суммы. Как эффективнее всего?

рабочая посылка

нерабочая посылка

Что это значит?

6

Re: Подсчет контрольной суммы. Как эффективнее всего?

Прошу прощения.
Рабочая, имел ввиду - что воспринимается адресатом как надо и строка символов из посылки на экране отображается.
Эта посылка сформирована "вручную", чек сумму считал калькулятором.

Нерабочая - в шину передается, но никакой реакции нет.  Навкодер (я им параллельно смотрю) - тоже во втором случае не реагирует на посылку, так обычно происходит, когда неправильная структура посылки (длинна-чексумма).

Насколько я успел заметить - во втором случае изменяются две последние позиции посылки. А в "оригинале" чексумма - одна последняя позиция (27)

7

Re: Подсчет контрольной суммы. Как эффективнее всего?

Как я понял, вы не можете выбирать алгоритм расчета контрольной суммы самостоятельно, а должны использовать какой-то определенный? В этом случае, разумеется Modbus вам не подойдет. Вам необходимо организовать подсчет контрольной суммы в диаграмме, в соответствии с требуемым алгоритмом.

8

Re: Подсчет контрольной суммы. Как эффективнее всего?

Пока у меня два пути, по которым все получается:
1. подсчет вручную виндосовским калькулятором через XOR всех байтов посылки
2. отправкой через I-Bus analyser посылки без чек суммы, программа добавляет ее автоматом, и я могу на выходе "подсмотреть" результат.
Но это годится только для статичных сообщений.

Речь о i-bus шине, контрольная сумма для которой - последний байт посылки, как результат всех предыдущих через XOR

Буду пробовать реализовать через блоки диаграммы.

Благодарю

9

Re: Подсчет контрольной суммы. Как эффективнее всего?

Речь о i-bus шине, контрольная сумма для которой - последний байт посылки, как результат всех предыдущих через XOR

Ясно. Появись эта информация в исходном сообщении, тема была бы намного короче.