关闭正在运行的 QSerialPort 的电源是不是有问题?
Posted
技术标签:
【中文标题】关闭正在运行的 QSerialPort 的电源是不是有问题?【英文标题】:Is it a problem to turn off power to a running QSerialPort?关闭正在运行的 QSerialPort 的电源是否有问题? 【发布时间】:2018-09-22 13:32:43 【问题描述】:我正在开发一个具有多个串行端口的应用程序。这些端口中的每一个都由不同的线程处理并具有自己的QSerialPort
对象。从硬件的角度来看,它们是分层连接的,这意味着有一个主设备通过 USB 电缆(1 个 COM 端口)连接到 PC,到这个主设备还有几个其他设备连接,每个设备都有自己的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();
【问题讨论】:
能否在出现分段错误的地方添加代码? @ElevenJune 我不知道它发生在哪里。这就是为什么我只是抽象地说,没有代码示例。 能否展示您创建 QSerialPort 并将它们放入不同线程的部分? @ElevenJune 更新了问题。 您的 SomeObject* 和 QSerialPort* 在同一个线程中吗?这是我的代码:m_serialPort = new QSerialPort(); m_serialPortThread = new QThread(); m_serialPort->moveToThread(m_serialPortThread); moveToThread(m_serialPortThread); m_serialPortThread->start();
My SomeObject* 创建 QThread 并使用其 QSerialPort 在其中移动。
【参考方案1】:
尝试断电前销毁端口对象,上电后重新创建
QSerialPort *port = new QSerialPort();
//init and use
//....
delete port;
port = nullptr;
//turn the power off
//turn the power on
port = new QSerialPort();
【讨论】:
问题是,打开和关闭端口是异步的。我不知道什么时候会发生,所以我无法销毁对象。以上是关于关闭正在运行的 QSerialPort 的电源是不是有问题?的主要内容,如果未能解决你的问题,请参考以下文章