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

QSerialPort接收丢字节问题求助:仅收到第一个字节

解决QSerialPort仅接收第一个字节的问题

核心原因

串口通信是流式传输,readyRead信号可能分批触发(比如第一个字节先到达,剩下的2字节后续才传输完成),你当前的接收逻辑每次只读取当前可用数据,没有做累积缓存,所以只拿到了第一字节。另外还要注意QDataStream的序列化一致性问题。

具体解决步骤

1. 确认发送端实际发送的字节数

在发送代码里加一行打印,验证打包后的数据长度是否符合预期(unsigned char占1字节,unsigned short占2字节,总长度应为3):

qDebug() << "发送数据长度:" << data.size();

如果长度不对,检查QDataStream的版本设置,发送端要显式指定版本,避免不同Qt版本默认序列化规则差异:

dataStream.setVersion(QDataStream::Qt_5_15); // 替换为你实际使用的Qt版本

2. 接收端增加数据缓存逻辑

不要每次readyRead就直接处理当前数据,而是先把数据累积到缓冲区,等数据足够再解析:

  • 首先在接收类的头文件定义一个成员变量作为缓存:
    private:
        QByteArray m_recvBuffer;
    
  • 修改接收端的readyRead槽函数:
    QObject::connect(serialPort, &QSerialPort::readyRead, [&]()
    {
        // 将新收到的数据追加到缓存
        m_recvBuffer.append(serialPort->readAll());
        
        // 检查缓存中是否有足够的数据(这里需要3字节:1+2)
        while (m_recvBuffer.size() >= 3) {
            // 截取前3字节用于解析
            QByteArray tempData = m_recvBuffer.left(3);
            // 从缓存中移除已解析的部分
            m_recvBuffer.remove(0, 3);
            
            // 用QDataStream解析,和发送端保持版本一致
            QDataStream dataStream(&tempData, QIODevice::ReadOnly);
            dataStream.setVersion(QDataStream::Qt_5_15); // 和发送端版本相同
            
            unsigned char char1;
            unsigned short ushort1;
            dataStream >> char1 >> ushort1;
            
            // 打印解析结果验证
            qDebug() << "收到char1:" << char1 << "收到ushort1:" << ushort1;
        }
    });
    

3. 额外检查点

  • 确认串口参数(波特率、校验位、数据位、停止位)完全一致,包括流控设置(如果硬件流控没正确配置,可能导致数据丢失)
  • 测试时可以用串口助手先验证发送端的数据是否正常发出,排除硬件或串口本身的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:33:28