gpt4 book ai didi

c++ - 如何使 Qt5.13.1 的 QSerialPort 工作?

转载 作者:可可西里 更新时间:2023-11-01 10:10:40 26 4
gpt4 key购买 nike

问题

QSerialPort 来自 5.13.1 版本的 Qt 库在 Windows 7 和 10 下不物理输出数据。

例子

为了演示所描述的问题,我准备了以下设置:

  1. 硬件

我已经测试了带有物理串行端口 (COM1) 的 PC 与真实串行设备之间的连接,但出于演示目的,我通过将 PC DSub 连接器的引脚 2 和 3 连接在一起创建了一个简单的环回,即 Tx 和 Rx。

  1. 软件

问题出现在我自己的 GUI 应用程序中,以及 Qt 附带的官方示例中。但是,为了演示,我编写了一个非常基本的控制台应用程序:

SerialBug.pro

QT -= gui
QT += serialport

CONFIG += console

SOURCES += \
main.cpp

main.cpp

#include <QCoreApplication>
#include <QSerialPort>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QSerialPort port("COM1");

port.setBaudRate(QSerialPort::Baud4800);
port.setDataBits(QSerialPort::Data8);
port.setStopBits(QSerialPort::OneStop);
port.setParity(QSerialPort::NoParity);
port.setFlowControl(QSerialPort::NoFlowControl);

QObject::connect(&port, &QSerialPort::readyRead,
[&port](){
qDebug() << port.readAll();
});

QObject::connect(&port, &QSerialPort::bytesWritten,
[](qint64 bytes){
qDebug() << bytes;
});

QObject::connect(&port, &QSerialPort::errorOccurred,
[](QSerialPort::SerialPortError error){
qDebug() << error;
});

if (port.open(QSerialPort::ReadWrite)) {
qDebug() << port.write("Test");
}

return a.exec();
}

结果

在 Release模式下使用 MSVC2017 和 Qt 5.13.0 编译并运行示例代码,产生以下输出:

QSerialPort::NoError
4
4
"Test"

使用 MSVC2017 在 Release模式下编译完全相同的代码,但这次使用 Qt 5.13.1,产生以下输出:

QSerialPort::NoError
4

port.write 返回4,意思是4个字节发送到串口,但实际上并没有完成。 bytesWritten 未发出且数据未回读。

注意:串行监控程序正在显示写入的数据,但数据未到达引脚。

是否可以以任何方式修复代码以使其与 Qt5.13.1 一起工作?

最佳答案

原因

正在搜索 Qt bug tracker似乎有多个关于 QSerialPort 在 Windows 上的 Qt 5.13.1 上不工作的错误。所有这些都与 QTBUG-78086 重复其中还包含指向 Gerrit review of the fix 的链接.

来自错误描述:

The signal readyRead is never emitted, even if data is sent to the serial port from a connected device. The member bytesAvailable returns 0 even if data has been sent to the serial port from a connected device.

基本上,只有在没有通知待处理的情况下,他们才会尝试在 qwinoverlappedionotifier.cpp 中发出 _q_notify。不幸的是

That commit completely breaks the I/O on Windows.

解决方案

现在您可以选择降级到 5.13.0,等待 Qt 5.13.2 或

自己修复 Qt 5.13.1 qserialport:

  • 用QtCreator打开QTDIR\5.13.1\Src\qtserialport\qtserialport.pro
  • (可选)您可能需要选择一个套件,例如项目 -> 管理套件 -> Desktop Qt 5.13.1 MSVC2017 64bit
  • 在项目树中打开src/serialport/serialport-lib/sources/qwinoverlappedionotifier.cpp
  • 删除QAtomicInt pendingNotifications;
  • 改变

    if (!waiting && pendingNotifications-- == 0)
    emit q->_q_notify();

    if (!waiting)
    emit q->_q_notify();
  • 改变

    int n = pendingNotifications.fetchAndStoreAcquire(0);
    while (--n >= 0) {
    if (WaitForSingleObject(hSemaphore, 0) == WAIT_OBJECT_0)
    dispatchNextIoResult();
    }

    if (WaitForSingleObject(hSemaphore, 0) == WAIT_OBJECT_0)
    dispatchNextIoResult();
  • 在 QtCreator 中转到build -> clean all,然后run qmake,然后rebuild all

  • 找到构建文件夹,然后将 Qt5SerialPort.dllQt5SerialPortd.dllbuild\bin 复制并替换到 QTDIR\5.13.1\msvc2017_64\bin

您的代码现在应该可以工作了。

关于c++ - 如何使 Qt5.13.1 的 QSerialPort 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58020663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com