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

QT 6.4.1子窗口使用Serial Port:发送正常但无法接收数据

问题分析与解决

核心问题:信号槽连接失败

你遇到的接收无响应问题,大概率是信号与槽的连接未成功建立。原因在于Qt旧版SIGNAL/SLOT宏依赖字符串匹配机制,对参数签名要求严格:

  • 若SerialPort类的信号声明为void dataEmpfangen(QByteArray);
  • 而你的槽函数是void beiDatenEmpfangen(const QByteArray &empfData);
    两者参数类型(QByteArray vs const QByteArray&)在字符串层面不匹配,导致连接失败,串口接收到数据后发射的信号无法触发槽函数。

注:栈上创建子窗口的方式(subWindow sn_vb(this);)本身无问题,exec()会阻塞直到窗口关闭,期间窗口对象有效,排除生命周期问题。

解决方案

方案1:统一信号与槽的参数签名

修改信号或槽的参数,确保两者签名完全一致:

  • 要么将SerialPort的信号改为void dataEmpfangen(const QByteArray&);,同时同步信号发射代码为emit dataEmpfangen(receivedData);
  • 要么将槽函数改为void beiDatenEmpfangen(QByteArray empfData);,去掉const &

方案2:使用Qt新信号槽语法(推荐)

放弃旧的SIGNAL/SLOT宏,改用Qt5+支持的编译期检查语法,参数不匹配会直接在编译时报错,避免运行时隐藏问题:

// 替换subwindow.cpp中的对应connect语句
connect(serialport, &SerialPort::dataEmpfangen, this, &subWindow::beiDatenEmpfangen);

验证连接状态

可在connect后添加返回值检查,确认连接是否成功:

bool connectSuccess = connect(serialport, &SerialPort::dataEmpfangen, this, &subWindow::beiDatenEmpfangen);
qDebug() << "信号槽连接状态:" << connectSuccess;

若输出false,说明参数签名不匹配,需调整。

额外检查点

  1. 确认SerialPort类中正确发射信号:当串口读取到数据时,必须调用emit dataEmpfangen(读取到的QByteArray);
  2. 确认串口波特率、数据位、停止位等参数与Arduino完全一致,参数不匹配可能导致接收乱码或无响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:12:13