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
相关产品推荐
相关产品推荐

