![]() |
|
![]() |
#1 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Я использовал read в модуле AquaLog
Для коректного чтения в ардуино, после получения запроса нужно выдержать паузу 100мс и после пауза отправлять данные |
![]() |
![]() |
![]() |
#2 |
Senior Member
|
![]()
read не работает с нулевыми байтами насколько я понял и ещё похоже, что переменные в скрипте не могут содержать нулевые байты.
__________________
Россия навсегда! |
![]() |
![]() |
![]() |
#3 |
Senior Member
|
![]()
Создал простой модуль для тестирования работы по протоколу modbus при помощи скрипта в shell.
Посылки из javascript я научился делать, crc считается, всё нормально. Эмулятор принимает и распознаёт посылки, но почему-то не передаёт данные в ответ. Это странно, не могу пока объяснить такое поведение. Пробовал функции чтения 03 и 04. На картинки видно, что запрос принят, но ответной посылки нет. Зато запись (функция 06) работает. В общем осталось разобраться почему эмулятор не выдаёт запрошенные данные. П.С. Возможно дело в каком-то таймауте или задержке. Надо бы попробовать на каком-нибудь реальном железе.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 08:55. |
![]() |
![]() |
![]() |
#4 |
Senior Member
|
![]()
С другим симулятором работает. Ура. На картинке чтение (03) с адреса 0x0000, где находится значение 0x0A (10).
Осталось унифицировать интерфейс и проверить работу с реальным железом. В общем и целом это означает, что можно при помощи нескольких строк в shell со стандартными командами и дополнительных функций на javascript реализовывать протоколы, основанные на обмене массивами байт, в том числе с расчетом crc.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 09:33. |
![]() |
![]() |
![]() |
#5 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Проверить нет возможности, вернусть 13 июня, протестирую
|
![]() |
![]() |
![]() |
#6 |
Senior Member
|
![]()
К тому времени попробую оформить интерфейс более универсально, добавлю настройки для последовательного порта и выложу архив с модулем для CyberWrt. У меня в принципе есть плата с avr и прошивка для modbus slave, просто симулятором тестировать сейчас быстрее.
Желательно попробовать на реальном модуле ввода-вывода каком-нибудь, промышленном или около того. П.С. Нашёл crc16 алгоритм для bash: crc16 algorithm from C++ to bash. Не уверен, что он будет работать для произвольных данных. Не знаю как его использовать для произвольных бинарных данных. И ещё один вариант: CRC-16 checksum of a string.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 13:11. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
|
![]()
Оказывается, что будут. С доработкой конечно. Я поначалу не мог понять смысла, почему они имеют в виду строки. Оказывается это нужно, чтобы интерпретатор мог работать с байтами как с числами.
Скрипт может выглядеть так: Код:
string="001005000006000001" cnt=${#string} let 'cnt -= 3' crc=0xFFFF for i in `seq 0 3 $cnt`; do crc=$(( crc ^ ${string:$i:3} )) for j in `seq 0 7`; do c=$(( crc >> 1 )) if [ $(( crc & 1 )) = 1 ]; then let 'c ^= 0xA001' fi crc=$c done done printf "0x%04X" "$crc" echo Код:
2014.06.18 13:47:30 [INFO:30500] ( => ) 0x01_0x05_0x00_0x06_0x00_0x01_0xEC_0x0B 2014.06.18 13:47:30 [INFO:30500] ( <= ) 0x01_0x85_0x03_0x02_0x91 Для второй строки (string="001133003") получим ответ: 0x9102 На хабре меня не поправили. Оказывается можно считать crc, если представить числа в "интерпретируемом виде".
__________________
Россия навсегда! Последний раз редактировалось uni; 19.06.2014 в 20:23. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
чего-то у меня не выходит
![]() попробовал перевести 599517 - вывело 0x427C а должно быть 0925DD |
![]() |
![]() |
![]() |
#10 | |
Senior Member
|
![]()
Там числа нужно было вводить в десятичном представлении по три разряда на число, т.е. 0x85 = 113.
Вот новый вариант, где можно hex'ами побайтно писать: Код:
string="010500060001" cnt=${#string} let 'cnt -= 2' crc=0xFFFF for i in `seq 0 2 $cnt`; do crc=$(( crc ^ 0x${string:$i:2} )) for j in `seq 0 7`; do c=$(( crc >> 1 )) if [ $(( crc & 1 )) = 1 ]; then let 'c ^= 0xA001' fi crc=$c done done printf "0x%04X" "$crc" echo Цитата:
__________________
Россия навсегда! Последний раз редактировалось uni; 19.06.2014 в 23:24. |
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|