Я разрабатываю приложение с несколькими последовательными портами.Каждый из этих портов обрабатывается отдельным потоком и имеет свой собственный объект 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();