Python + QT + виртуальный COM-порт

Сделал себе лампу которая по радио-каналу управляется с компьютера. Пришло время писать софт.
Выбрал для этого связку Python2.7 + QT. Блок управления втыкается в USB и в системе появляется виртуальный COM-порт. Поставил библиотеку pySerial и довольно быстро написал приложение которое просто отсылает посылки на лампу при нажатии кнопки.

На самой лампе тоже есть ручное управление так что надо слушать COM-порт и если с лампы пришел сигнал о том что там покрутили ручку — то в окне на компьютере менять состояние на новое у контроллов…

И вот тут встала проблема — кусок программы что слушает COM-порт это цикл бесконечный, а следовательно программа повисает наглухо в этом цикле, окна не отрабатываются и ничего никуда не крутиться…

В самом контроллере у меня действия на прерываниях висят и во времена моей работы в DOS (в далеких 90х годах) я тоже писал софт активно используя прерывания. Но сейчас не те времена и сдается мне это решается как по иному…

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

ВОПРОС:
Как пишутся такие приложение, когда надо слушать что пришло из порта например и в то же время чтобы это не вешало программу до тех пор пока это вообще придет? И надо же еще и писать в порт в то время когда оттуда ни что не читается — чтобы команды отсылать обратно и окно отрабатывать…
  • Вопрос задан
  • 9042 просмотра
Пригласить эксперта
Ответы на вопрос 4
Desiderata
@Desiderata
Можно прослушивать COM-порт в отдельном потоке, а при изменении состояния лампы отправлять сигнал в интерфейс программы.
Ответ написан
noonv
@noonv
можно в отдельном потоке, а можно использовать неблокирующий доступ.
Ответ написан
Комментировать
@agmt
Можно заиспользовать QSerialPort. Ну или просто QSocketNotifier, который будет испускать сигнал при готовности данных на чтение.
Ответ написан
@smartass111
Я делал на основе terminal.py (пример из библиотеки serial) — класс с методом reader,
который while(1) висит на комп порту и разбирает оттуда байты
Метод запускается в отдельном потоке
Работа с некоторыми объектами изнутри потока обязательно with lock.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы