Russian Qt Forum

Qt => Общие вопросы => Тема начата: sergek от Август 01, 2017, 20:30



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


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


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: Bepec от Август 03, 2017, 17:51
Обрубить все сигналы, закрыть порт, удалить объект.

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

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


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: sergek от Август 03, 2017, 20:04
Обрубить все сигналы, закрыть порт, удалить объект.
Не, удалять мне не надо...


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: kuzulis от Август 03, 2017, 23:10
Цитировать
Кто их генерирует - еще не разобрался.

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


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: sergek от Август 04, 2017, 09:43
Может быть, там еще баги есть в QModbusRtuSerialMaster, надо курить сорцы.
Это намек на то, что закрытие порта в слоте readyRead должен бы отрабатывать корректно? Как вы обычно делаете закрытие порта в QtSerialPort?
Уточню, что обращение к порту выполняется периодически. А порт надо держать открытым только на время получения данных, после чего он должен закрываться. И все это в асинхронном режиме.


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: kuzulis от Август 04, 2017, 14:19
Да пущай открытым и висит, какие проблемы то?

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

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


Название: Re: Закрытие последовательного порта в Qt SerialBus
Отправлено: sergek от Август 04, 2017, 17:47
Да пущай открытым и висит, какие проблемы то?
Проблема одна - никто другой к этому порту больше не подключится
Никак. По действию пользователя - захотел - закрыл, захотел - открыл.
Понял, спасибо.