RS-485 / UART

В: RS-485 не работает через параметры DTS (linux,rs485-enabled-at-boot-time), только через ioctl

О: Настройка через DTS должна работать, но надёжнее использовать ioctl напрямую. Рекомендуемый минимальный код инициализации:

struct serial_rs485 rs485; memset(&rs485, 0, sizeof(rs485)); rs485.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND; ioctl(serial_fd, TIOCSRS485, &rs485);

Параметр rs485-rts-active-high в DTS избыточен — высокий уровень используется по умолчанию. Утилита rs485conf из buildroot позволяет проверить текущую конфигурацию порта.

В: В RS-485 режиме теряется последний байт при приёме собственного эхо

О: Установить флаг SER_RS485_RX_DURING_TX в структуре rs485. Его отсутствие обнуляет RX FIFO после передачи последнего байта при переключении TX→RX, из-за чего последний принятый байт теряется.

Схемотехническая рекомендация: соединить #RE и DE вместе — это исключает артефакты на RX при переключении.

В: При loopback-тесте UART (RX и TX замкнуты) ОС зависает, в dmesg rcu_preempt detected stalls

О: Причина — включённый DMA в конфигурации UART. Для тестов DMA вреден. Удалите из DTS-узла UART:

&uart9 { /delete-property/ dmas; /delete-property/ dma-names; };

DMA в UART нужен только для специфических применений (например, Bluetooth). Для стандартных RS-485 задач DMA не требуется.

В: Если убрать CTS из pinctrl UART, cat зависает при повторном использовании порта

О: CTS участвует в управлении приёмником RS-485. Если CTS убран из pinkontrol, оставьте только нужные сигналы:

pinctrl-0 = <&uart7m1_xfer>; /* без uart7m1_ctsn */

Убедитесь, что после первого сеанса RTS корректно отпускается — cat может не освобождать RTS при завершении, блокируя последующие открытия порта.