Название: Закрытие последовательного порта в Qt SerialBus Отправлено: sergek от Август 01, 2017, 20:30 Коллеги,
работаю с последовательным портом с использованием QModbusRtuSerialMaster в асинхронном режиме, т.е. ответ устройства обрабатываю асинхронно, по сигналу. Мне нужно закрыть подключение к порту после завершения обработки запроса и неожиданно столкнулся с проблемой - а как зафиксировать момент, когда это можно сделать? Сначала попробовал сделать disconnectDevice в самом слоте обработки ответа: получил результат, отправил его куда нужно и закрыл. Не получилось - приходят ошибки QModbusDevice::ConnectionError (Cannot open serial device). Кто их генерирует - еще не разобрался. А вопрос в следующем - как правильно организовать закрытие порта при асинхронной обработке ответа? Поделитесь опытом, пожалуйста. Название: Закрытие последовательного порта в Qt SerialBus Отправлено: sergek от Август 01, 2017, 20:54 Забыл уточнить - работа происходит в одном (главном) потоке.
В связи с этим проверил еще один вариант: сделал раздельные сигналы для передачи полученных данных потребителю и сигнал завершения приема данных (для сигнализации того, что можно закрывать соединение), примерно так (псевдокод): Код: class Controller Код: emit responceSig(data); После этого все заработало без ошибок, порт закрывается, как надо. Но как-то это не очевидно, должны тут использоваться какие-то принципы, о которых я не знаю. Подскажите, как правильно? Название: 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 Да пущай открытым и висит, какие проблемы то? Проблема одна - никто другой к этому порту больше не подключитсяНикак. По действию пользователя - захотел - закрыл, захотел - открыл. Понял, спасибо. |