Russian Qt Forum

Qt => Общие вопросы => Тема начата: sergek от Октябрь 26, 2017, 19:43



Название: [РЕШЕНО] serialbus через UART
Отправлено: sergek от Октябрь 26, 2017, 19:43
Коллеги,
есть программа, которая на Raspberry pi опрашивает по modbus устройство с интерфейсом RS-485, подключенное через преобразователь USB/RS-485. Используется Qt Serial Bus через порт ttyUSB0. Понадобилось теперь перенести это хозяйство на Raspberry pi Zero.
Из-за недостатка USB портов (в одном торчит флешка с ОС) вместо него используется UART ttyS0, устройство умеет работать по UART.
Однако обмен не работает, вываливается ошибка 3 Resource error. Права на uart такие же, что и USB.
Железяка с uart работает, пробовали работать с ней с помощью opnhab.
В чем может быть проблема на rpi zero?


Название: Re: serialbus через UART
Отправлено: kuzulis от Октябрь 26, 2017, 22:21
Сначала нужно проверить сам ttyS0, может это не тот что кажется, потом посмотреть на это (https://bugreports.qt.io/browse/QTBUG-48304), а потом уже думать.


Название: Re: serialbus через UART
Отправлено: sergek от Октябрь 27, 2017, 00:11
Почитал, ничего не придумывается :( Сделал минимальный тестовый пример - открыть порт и прочесть два holding регистра. Под рутом подключается, запрос передается, дальше - какая-то фигня:
Код:
sergek@LCSp:~/Modbus-uart $ sudo ./master
port: /dev/ttyS0, unit id: 1, address: 1, entries: 2
Connected
qt.modbus: (RTU client) Sent Serial PDU: 0x0300010002
qt.modbus.lowlevel: (RTU client) Sent Serial ADU: 0x01030001000295cb
qt.modbus: (RTU client) Send successful: 0x0300010002
qt.modbus: (RTU server) QSerialPort error: QSerialPort::SerialPortError(ResourceError) "Ресурс временно недоступен"
qt.modbus: (RTU client) Receive timeout: 0x0300010002
qt.modbus: (RTU server) QSerialPort error: QSerialPort::SerialPortError(ResourceError) "Ошибка ввода/вывода"
qt.modbus: (RTU client) Sent Serial PDU: 0x0300010002
qt.modbus.lowlevel: (RTU client) Sent Serial ADU: 0x01030001000295cb
qt.modbus: (RTU server) QSerialPort error: QSerialPort::SerialPortError(ResourceError) "Ошибка ввода/вывода"
qt.modbus: (RTU server) QSerialPort error: QSerialPort::SerialPortError(ResourceError) "Ошибка ввода/вывода"
...
и т.д.
В QModbusClient::errorOccurred лезет ошибка "Resource error".
А нужны для UART какие-нибудь дополнительные пакеты, кроме тех, что есть в системе для RPi zero?


Название: Re: serialbus через UART
Отправлено: kuzulis от Октябрь 27, 2017, 09:04
Цитировать
Почитал, ничего не придумывается

Эмм...

1. Если нужно запустить от пользователя - то нужно добавить его
в группу dialout, tty, uucp (в зависимости от дистрибутива).

2. Modbus Rtu в qtserialbus работает через QSerialPort, который,
в свою очередь, при открытии всегда создает lock-файлы в /var/lock
или, возможно, немного других местах. Так вот, перед запуском
от пользователя желательно найти и удалить эти файлы, если ранее
пытались запускать от рута, иначе оно не откроется.

3. Т.к. оно работает через QSerialPort, то желательно запустить
его terminal-пример на борде и попробовать что-то по-посылать,
по-принимать - вылезет или нет ошибка там.

Цитировать
лезет ошибка "Resource error".

Я дал ссылку выше на баг репорт, в котором говорится, что это модет быть
из-за проблем с драйверами в Убунте в определенных ядрах.
Я не знаю, что стоит на твоем Raspberry pi, нужно просто посмотреть версию
ядра и попробовать его обновить/откатить, выкинуть нахрен Убунту и накатить
ArchLinux.

Также непонятна версия Qt.


Название: Re: serialbus через UART
Отправлено: sergek от Октябрь 27, 2017, 12:14
Эмм...
Спасибо огромное, заработало!
Мои коллеги, которые сейчас работают с малиной, утверждают, что помогло дополнительное включение пользователя в группу tty (раньше был только dialout). Я им не верю ;), т.к. я пробовал от рута - результат отрицательный. Скорее всего, поправили еще /boot/config.txt (enable_uart=1) и cmdline.txt. Может быть, не перезагрузили ее.
Теперь-то и рут, и мой пользователь свободно работают с uart.
По остальным пунктам:
2) проверил - нет ничего лишнего, порт открывался нормально.
3) до terminal-примера дело не дошло, но буду иметь в виду - ребята, когда готовят новую машину всегда чего-то забывают ;)
Ядро и дистрибутив Linux version 4.9.35+, Distributor ID: Raspbian, Description: Raspbian GNU/Linux 8.0 (jessie).
Qt 5.7.