Подключил контроллер SR1568 (солнечных панелей) на выделенный отдельный порт, отправляю команду (у которой простой фиксированный ответ) используя serial_tool:
Такая же ситуация с остальными командами - ответы все есть, но выглядят некорректно…
Ответы идемпотентны и приходят на все команды, т.е. проблема только с корректным декодированием ответа…
Китайцы подняли руки вверх и отправили на все четыре…
повторив трижды “это не 485”
Может быть есть идеи как правильно декодировать ответ?
Добрый день,
Предлагаю начать с трёх пунктов
1)Удостоверьтесь что отключён драйвер wb-mqtt-serial, он может мешать использованию порта
systemctl stop wb-mqtt-serial # Остановка
(systemctl start wb-mqtt-serial #Для запуска после экспериментов)
2) Можете отправить ту же команду ADS123:GET_PRODUCT\r\n без пробела, судя по мануалу в командах нет пробелов(байт 0x20).
3) Так же можно отправлять другие команды или отправлять несуществующие в мануале команды, и понять возвращается разное или одно и то же. Возможно что мы получаем код ошибки ошибку.
п.1 Как он может мешать? Есть ли возможность указать драйверу какие порты использовать, а какие не трогать? Будет ли добавлена возможность включать дебаг логирование на конкретном порту (а не везде-и-вся, как сейчас)?
В общем случае, зачем останавливать wb-mqtt-serial, если целевая работа это как раз опрос порта при одновременно работающем драйвере…
Правильнее было бы иметь возможноть указать ему с какими портами работать…
п.2 Смотрели невнимательно - на скрине видно, что в команде присутствует пробел. При вызове без пробела ответа нет:
п.3 Пробовал, в основном ответы всегда повторяющиеся (в командах где ожидается фиксированный ответ), но на команды, где возвращаются переменные параметры, приходят разные ответы
Вставлю сюда ответ на ADS123:GET_PRODUCT текстом, может кто-нибудь решит этот пазл… убрав/добавив/переставив байты/префикс/суффикс…
serial_tool -b 9600 -p N -d 8 -s 1 -t 1 /dev/ttyMOD1
serial_tool on /dev/ttyMOD1: 9600 8N1.0
Enter your commands below in HEX form.
All characters but 0-9,a-f including spaces are ignored.
Press Control-D or Control-C to leave the application.
Press [Enter] to print received data
Вместо (ожидаемых) байтов, кроме первого/
41 (верно)
44 → 11
53 ->9A
31 → 29
для 44(0b00100010) получаем 11(0b10001000)
Что видим? Сдвиг на 2 бит.
для 53(0b11001010) - (0b01011001) - тоже сдвиг но на 4. Банально похоже на то что устройство одает два стопбита.
Советую подключить логанализатор и снять обмен.
пока что не вижу вариантов, как из нижней двоичной последовательности получить верхнюю…
вот в строчном виде что приходит
4351023449A58C35D984D490C1 => 01000011 01010001 00000010 00110100 01001001 10100101 10001100 00110101 11011001 10000100 11010100 10010000 11000001
вот что должно приходить
ADS123:SR1568 => 01000001 01000100 01010011 00110001 00110010 00110011 00111010 01010011 01010010 00110001 00110101 00110110 00111000
длины строк совпадают:
если принять что ожидаемый ответ - ADS123:GET_PRODUCTADS123:SR1568, то это 32 символа
получаемый ответ - 41119A292346461D4715A2E909254A12A4954351023449A58C35D984D490C1 это тоже ровно 32 символа…
Get_stat неудобно разбирать, по ому что там переменные величины… нужно сначала понять принцип декодирования, а потом все остальное будет делом техники…
Поясните пожалуйста как выполнился сдвиг на 4… когда вместо 53 получилось 9a.
Не арабскому уму непривычно разбирать строки, когда младший бит слева…
да, GET_STAT возвращает строку фиксированной длины и периодически символы в ответе меняются, что говорит о том, что данные датчиков считываются и измененные показания корректно отображаются …
Что именно делаете с полученным ответом, что не получается? Да, как минимум байт 2 - значение 0x9a не соответствует допустимому диапазону для “System
index(1~23)”
Если (предположить) рассмотреть гипотезу что полученные данные как-то портятся именно трансивером контролллера - то целесообразно попробовать то же самое на компьютере, используя другой трансивер (адаптер).
Я не делаю ничего с ответом, т.к. я не могу получить из него осмысленные значения.
Там кроме второго байта все остальные значения не конвертируются в осмысленный ascii
Думаю что “трансивером” там ничего не портится, какой ему смысл что-то портить или перекодировать, там сам контроллер панелей изначально шлет неверно закодированную строку…
Как пример, если из ответа выделить подстроку
то, согласно доке, в ней просматириваются следующие значения (двигаясь с конца строки)
47 15 A2 E9 69 25 95 41 51 02 14 24 34 D4 90 C1 CC FD 14 90 48 39 65 85 5A 02 14 04 E4 D1 23 88 35 E5 E4 D1 46 10 36
FF 34 B9 44 24 92 4E 99 61 AD 12 49 <= это температура 1 A7 99 61 AD 12 49 <= это температура 2 A7 99 61 AD 02 08 <= это температура 3 (E0 00 00 00 00 00 00 00 00 00) <= эти 10 байт пока пропускаем (00 00 00 00 00 01 01 24 10 40) <= эти 10 байт пока пропускаем 00 00 00 00 00 00 00 00 00 00 <= 10 байт ManualStatus
Из этого следует, что точка-разделитель целой и дробной части числа, приходит как ad вместо 2e (2e hex это 46 десятичных, chr(46) = ‘.’)
Чтобы получить из 2e => ad, нужно к 2e прибавить 127 десятичных…
Я пробовал к каждому символу ответа прибавлять 127 и отбрасывать старший бит, но все равно строка остается не декодируемой…
Я думаю, что нужно цепляться логическим анализатором, записывать хотя бы один запрос-ответ и разбираться со скоростью, четностью, стопами, и вообще может там инвертированное. А вот потом уже разбираться с мусором в ответе.