Является ли проблемой отключение питания работающего QSerialPort? - PullRequest
0 голосов
/ 22 сентября 2018

Я разрабатываю приложение с несколькими последовательными портами.Каждый из этих портов обрабатывается отдельным потоком и имеет свой собственный объект QSerialPort.С аппаратной точки зрения они связаны иерархически, что означает, что есть одно основное устройство, подключенное к ПК с помощью USB-кабеля (1 COM-порт), к этому главному устройству подключено несколько других устройств, каждое из которых имеет своеCOM порт.Основное устройство может включать / выключать питание этих дочерних портов.

В приложении порты обрабатываются асинхронно.Каждый объект устройства работает в своем собственном цикле.Если его порт открыт, он читает входящие данные.Если порт закрыт, он пытается открыть его в каждом цикле, пока не добьется успехаКаждый объект QSerialPort обрабатывает ошибки в сигнале errorOccurred.Если он получает ошибку DeviceNotFoundError, PermissionError, ResourceError, порт закрывается (если он был открыт), и цикл продолжается, как описано выше.

Проблема заключается в том, что эта последовательная коммуникационная частьсбой приложения (ошибка сегментации).Я потратил несколько дней, чтобы найти проблему, но пока безрезультатно.Чтобы лучше понять, что происходит, я хотел спросить здесь.Может ли быть проблемой для QSerialPort, если основное устройство отключает питание дочерних портов, когда они открыты и работают?Или если источник питания отключен, когда дочерние порты открываются / закрываются или на них выполняется какая-либо другая операция?(Я не хочу включать конкретный исполняемый код, поскольку он является частью более крупного приложения, и его было бы сложно создать и выполнить из него. Я хотел бы обсудить только концепции, описанные выше, если это возможно.)

Спасибо за любую помощь или идеи!

ОБНОВЛЕНИЕ

Создание QSerialPort и помещение его в другой поток:

QThread *t = new QThread(this)
SomeObject *o = new SomeObject(this);

o->moveToThread(t);
t->start();

Позже в SomeObject:

QSerialPort *port = new QSerialPort();

1 Ответ

0 голосов
/ 25 сентября 2018

Попытайтесь уничтожить объект порта перед отключением питания и воссоздать его после включения питания

QSerialPort *port = new QSerialPort();
//init and use
//....
delete port;
port = nullptr;
//turn the power off

//turn the power on
port = new QSerialPort();
...