You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 5.15.2串口读取无数据问题求助(Win64+MSVC2019_64)

问题描述
  • 使用com0com创建虚拟COM4/COM5,Br@y's Terminal测试双向通信正常
  • 采用Qt官方异步串口示例的SerialPortReader类连接COM5(9600波特率),但向COM4发送数据时handleReadyRead、handleError、handleTimeout槽函数均未触发,多次发送会导致终端冻结
  • 修改qserialport_win.cpp后问题依旧,初始化代码如下:
// Serial comm init
QSerialPort serialPort;
QString serialPortName = "COM5";
serialPort.setPortName(serialPortName);

int serialPortBaudRate = 9600;


if (serialPort.open(QIODevice::ReadOnly)) {
    if(serialPort.setBaudRate(serialPortBaudRate) &&
        serialPort.setDataBits(QSerialPort::Data8) &&
        serialPort.setParity(QSerialPort::NoParity) &&
        serialPort.setStopBits(QSerialPort::OneStop) &&
        serialPort.setFlowControl(QSerialPort::NoFlowControl)) {
        //SerialPortReader serialPortReader(&serialPort);
        SerialPortReader serialPortReader(&serialPort, this);
    } else {
        std::cout << "Failed to set COM connection properties " << serialPortName.toStdString() << serialPort.errorString().toStdString() << std::endl;
    }
} else {
    std::cout << "Failed to open port " << serialPortName.toStdString() << serialPort.errorString().toStdString() << std::endl;
}
解决方案
  • 修复局部变量生命周期问题:当前代码中SerialPortReader serialPortReader(&serialPort, this);是局部变量,初始化完成后会立即被销毁,导致信号槽连接失效。需将其改为类成员变量或动态分配内存:
    // 在类头文件中声明成员变量
    SerialPortReader *m_serialPortReader;
    
    // 初始化代码中创建实例
    m_serialPortReader = new SerialPortReader(&serialPort, this);
    
  • 检查SerialPortReader的信号槽连接:确保SerialPortReader构造函数中正确关联串口信号与槽函数,示例如下:
    SerialPortReader::SerialPortReader(QSerialPort *serial, QObject *parent)
        : QObject(parent), m_serial(serial)
    {
        connect(m_serial, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead);
        connect(m_serial, &QSerialPort::errorOccurred, this, &SerialPortReader::handleError);
        // 若使用超时逻辑,需初始化定时器并连接信号
        m_timer.setSingleShot(true);
        connect(&m_timer, &QTimer::timeout, this, &SerialPortReader::handleTimeout);
        m_timer.start(5000); // 设置超时时间
    }
    
  • 调整串口打开模式:建议使用QIODevice::ReadWrite模式打开串口,避免只读模式可能引发的数据流阻塞:
    if (serialPort.open(QIODevice::ReadWrite)) {
        // 配置串口参数...
    }
    
  • 恢复Qt串口源码:修改qserialport_win.cpp可能引入未知问题,先恢复官方原始代码,优先排查自身代码逻辑。
  • 核对虚拟端口参数:确认com0com创建的虚拟端口,其数据位、校验位、流控等参数与Qt代码中的配置完全一致,避免参数不匹配导致通信异常。

内容的提问来源于stack exchange,提问作者LimeAndConconut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:30:50