Russian Qt Forum
Декабрь 14, 2017, 17:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Закрытие последовательного порта в Qt SerialBus  (Прочитано 826 раз)
sergek
Программист
*****
Offline Offline

Сообщений: 508


Мы должны приносить пользу людям!


Просмотр профиля
« : Август 01, 2017, 20:30 »

Коллеги,
работаю с последовательным портом с использованием QModbusRtuSerialMaster в асинхронном режиме, т.е. ответ устройства обрабатываю асинхронно, по сигналу. Мне нужно закрыть подключение к порту после завершения обработки запроса и неожиданно столкнулся с проблемой - а как зафиксировать момент, когда это можно сделать?
Сначала попробовал сделать disconnectDevice в самом слоте обработки ответа: получил результат, отправил его куда нужно и закрыл. Не получилось - приходят ошибки QModbusDevice::ConnectionError (Cannot open serial device). Кто их генерирует - еще не разобрался.
А вопрос в следующем - как правильно организовать закрытие порта при асинхронной обработке ответа? Поделитесь опытом, пожалуйста.
Записан

Qt 5.9.1 Qt Creator 4.4.1
Win7, Win10, Ubuntu 14.04
sergek
Программист
*****
Offline Offline

Сообщений: 508


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #1 : Август 01, 2017, 20:54 »

Забыл уточнить - работа происходит в одном (главном) потоке.
В связи с этим проверил еще один вариант: сделал раздельные сигналы для передачи полученных данных потребителю и сигнал завершения приема данных (для сигнализации того, что можно закрывать соединение), примерно так (псевдокод):
Код:
class Controller
{
...
signals:
void responceSig(Type data);
void receiveCompleteSig();
};
Вызов этих сигналов выполняется поочередно из Controller
Код:
emit responceSig(data);
...
emit receiveCompleteSig();
а слоты, обрабатывающие эти сигналы соединены с использованием очереди (Qt::QueuedConnection).
После этого все заработало без ошибок, порт закрывается, как надо.
Но как-то это не очевидно, должны тут использоваться какие-то принципы, о которых я не знаю. Подскажите, как правильно?
Записан

Qt 5.9.1 Qt Creator 4.4.1
Win7, Win10, Ubuntu 14.04
Bepec
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 7591


W7 x64, Qt SDK 4.7.2, Руки v1.5


Просмотр профиля
« Ответ #2 : Август 03, 2017, 17:51 »

Обрубить все сигналы, закрыть порт, удалить объект.

Или, если уж особо хочется можно использовать deleteLater.

PS похожая фигня с Ком портами бывает, особенно если они программные.
Записан

"Мастер простых решений" Ɋt

чОрный список: Spark
sergek
Программист
*****
Offline Offline

Сообщений: 508


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #3 : Август 03, 2017, 20:04 »

Обрубить все сигналы, закрыть порт, удалить объект.
Не, удалять мне не надо...
Записан

Qt 5.9.1 Qt Creator 4.4.1
Win7, Win10, Ubuntu 14.04
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2594


Просмотр профиля
« Ответ #4 : Август 03, 2017, 23:10 »

Цитировать
Кто их генерирует - еще не разобрался.

Может быть, там еще баги есть в QModbusRtuSerialMaster, надо курить сорцы.
Записан

ArchLinux x86_64 / Win10 64 bit
sergek
Программист
*****
Offline Offline

Сообщений: 508


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #5 : Август 04, 2017, 09:43 »

Может быть, там еще баги есть в QModbusRtuSerialMaster, надо курить сорцы.
Это намек на то, что закрытие порта в слоте readyRead должен бы отрабатывать корректно? Как вы обычно делаете закрытие порта в QtSerialPort?
Уточню, что обращение к порту выполняется периодически. А порт надо держать открытым только на время получения данных, после чего он должен закрываться. И все это в асинхронном режиме.
Записан

Qt 5.9.1 Qt Creator 4.4.1
Win7, Win10, Ubuntu 14.04
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2594


Просмотр профиля
« Ответ #6 : Август 04, 2017, 14:19 »

Да пущай открытым и висит, какие проблемы то?

Цитировать
Как вы обычно делаете закрытие порта в QtSerialPort?

Никак. По действию пользователя - захотел - закрыл, захотел - открыл.
Записан

ArchLinux x86_64 / Win10 64 bit
sergek
Программист
*****
Offline Offline

Сообщений: 508


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #7 : Август 04, 2017, 17:47 »

Да пущай открытым и висит, какие проблемы то?
Проблема одна - никто другой к этому порту больше не подключится
Никак. По действию пользователя - захотел - закрыл, захотел - открыл.
Понял, спасибо.
Записан

Qt 5.9.1 Qt Creator 4.4.1
Win7, Win10, Ubuntu 14.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.072 секунд. Запросов: 22.