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

