0
<< предыдущая заметка 
11 марта 2026
Уже неделю бьюсь с RS485

Мы из столбов и толстых перекладин
За складом оборудовали зал.
Там Гамлета играл ефрейтор Дядин
И в муках руки кверху простирал.


Евгений Винокуров

Вторую неделю бьюсь с RS485 и не могу победить. Есть китайские мопеды (в количестве), у них процессор с дисплеем на приборке и батарея, имеющая три сигнальных провода rs485: черный — земля, белый — А, серый (или синий) — B. Землю можно не подключать, но конечно пробую по-всякому. Подключаю провода к свистку rs485-uart, читаю посылки. Расшифровываю протокол, он оказывается прост и довольно стандартен (позже я даже нашел, что его реверснули и китайцы и получили то же):

[показать спрятанное]
прелюдия 0xFE в количестве 3-4 (иногда может отсутствовать)
0x68
2 байта Адрес
0x68
1 байт Команда (если ответ, к номеру добавляется 0x80)
1 байт Количество байт данных
N байт Сами данные, но из каждого байта следует вычесть зачем-то 0x33
1 байт Контрольная сумма
0x16

Посылки читаются, контрольные суммы сходятся. Например:

FE FE FE FE 68 31 CE 68 02 02 60 6A 9D 16

Это посылка, которую я для понятности раскодирую себе в такой вид:
31CE-02 [ 2D 37 ]

Нарисовал себе читалку-инструментик прямо на вебе (благо Chrome десктопа позволяет работать с UART): https://lleo.me/uart/ Подслушиваю разговор мопеда с батареей. На запрос мопеда 31CE 02 (чтение) с данными 02 2B или 2D 37 не отвечает никто, если батареи нет, а если есть — она отвечает 31CE 82 с инфо (включая серийник) и состоянием (процент заряда, напряжение, ток, температура, вольтаж на каждой банке). Я знаю о ней всё:

[показать спрятанное]
Данные запроса 02 2B и 2D 37 — соответственно, прочесть 43 штуки байт (2B), начиная с адреса 02 или 55 (37) с адреса 2D:

31CE-02 [ 02 2B ]

31CE-82 [ 24 11 55 55 55 55 01 42 4D 42 48 42 55 32 4A 38 31 34 30 30 30 32 33 2A 29 1D 21 26 1F 30 BA 46 3C 37 32 EC F1 01 30 75 94 00 0B ]

31CE-02 [ 2D 37 ]

31CE-82 [ 01 E1 00 00 00 00 38 00 00 07 15 15 15 15 16 0E 75 0E 77 0E 79 0E 7A 0E 6D 0E 78 0E 79 0E 7A 0E 78 0E 7D 0E 7D 0E 7C 0E 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

А батарея с зарядом не 56% (0x38) а 100% (0x64) и вольтажами около (10 14 = 4116 mV) соответственно:

31CE-82 [ 02 17 00 00 00 00 64 00 00 00 15 15 15 15 15 10 13 10 15 10 14 10 14 10 14 10 14 10 14 10 15 10 14 10 15 10 16 10 17 10 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

В общем, посылки получаю, расшифровываю, формат известен, данные правильные, контрольные суммы сходятся, и всё это точно RS485, не RS232, не CAN и не LIN. Казалось бы, могу и сам отправлять их в линию, и меня услышат. Но хрен там — меня не слышат. Слева — посылки нормального человека, справа — с моего свистка:

Нет положенных в rs485 размахов аплитуды, каждый канал уходит в минус только до средней линии. Над этой загадкой я бился, потом подсказали друзья. Мой китайский свисток в принципе раньше работал мастером нормально, но если он не мастер и линия подтянута, работать нормально не сможет. В драйвере rs485 на микросхеме MAX458 есть сигнал DT (ноги 2,3), который переключает ее в прием/передача. Этим должен управлять комп, но китайцы делают «автораспознавание»: тупо завели TX через транзистор. Поэтому когда 1, MAX458 честно передает 1, а когда 0, передача выключается, сигналы падают к уровням тишины, и 0 не отрабатывается по полной амплитуда. Ставят эту дурацкую схему, разумеется, как в дешевые китайские свистки, так и во многие дорогие (традиционный херушка на воротничок любителям ориентироваться в мире суеверий по цене).

Ну ок, не вопрос. Я выяснил, что вторая микросхема свистка uart CH340C имеет выводы RTS и DTR (не все варианты CH340 их имеют), припаял с ножки 14 резистор 10k и выставляю с компа RTS принудительно на время передачи (JS в Chrome и это умеет).

Результат — теперь мои сигналы стали идеальными:

Казалось бы, проблема решена? Но нет, батарея все равно меня не слышит и отвечать не хочет :) Все остальное, разумеется, уже перепробовал: землю, полярности A/B, тайминги, 120 Ом терминатор, линию никто не глушит, посылки не накладываются, сами на 100% соответствуют формату, и их последовательность тоже (пробовал слать в батарею и вообще всё, что слышно в мопеде). Причем, батарея посылку слышит — она явно «просыпается» по первой же посылки: уровни тишины линии сдвигаются на 0.5V вверх, через какое-то время засыпает снова. Но отвечать мне считает ниже своего достоинства. Больше идей у меня пока нет. Может, у вас есть?

Бывало, выйдет, головой поникнет,
Как надо, руки скорбно сложит, но
Лишь только «быть или не быть?» воскликнет,
Всем почему-то делалось смешно.


Евгений Винокуров

<< предыдущая заметка  
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий