关闭正在运行的 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 信号上的错误。如果它收到DeviceNotFoundErrorPermissionErrorResourceError 错误,则端口关闭(如果已打开),循环继续如上所述。

问题是应用程序的这个串行通信部分正在崩溃(分段错误)。我花了几天时间寻找问题,但到目前为止还没有结果。为了更好地了解发生了什么,我想在这里问。 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 的电源是不是有问题?的主要内容,如果未能解决你的问题,请参考以下文章

检查显示是不是被windows电源管理关闭

Qt QSerialport 未插入设备未关闭

使用 ESXi esxcli 命令关闭虚拟机电源

Qt 小部件的 QSerialPort 读数刷新太快

QSerialPort 不一致的行为取决于起始波特率

关闭iOS电源按钮上的应用程序关闭