QT C++ 串口发送大数据

本文探讨了如何使用C++和QT进行串口通信,解决在发送七八百字节大数据时,如何确保收端完整接收并拼凑数据的问题,特别关注了分块发送和收端处理的细节优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

有时需要串口发送数据大量数据比如七八百个字节,收端需要接收数据后如何把数据给拼凑起来。
使用工具 QT、 C++

解决方案:

发端代码:

如果每次发送 1000 字节 而不是 4096 字节,收端会触发两次槽函数,第一次接收1000,第二次一次性接收 4096,所以干脆直接每次发送 4096 字节 的数据。但是因为触发次数只有两次,只能实现 8K之内发送多少就接收多少,具体如何突破限制,欢迎大家予以指教。

void MainWindow::on_sendButton_clicked()
{
    QString waitSend = ui->textEdit_2->toPlainText();
    qDebug()<<"waitSend.size(): "<<waitSend.size();
    int n = waitSend.size();                           //剩余的字节数
    if (waitSend.size() > 4096) {
        for (int i = 0; i < waitSend.size(); ) {      //大包发送
             QByteArray buf;
            if (n > 4096) {
                buf.clear();
                buf = waitSend.mid(i, 4096).toUtf8();
                i += 4096;
                n -= 4096;
            } else {     //最后一次
                buf.clear();
                buf = waitSend.mid(i, n).toUtf8();
                i += n;

            }

            QString buf2 = buf;
            qDebug() <<"buf2: "<<buf2;
            qDebug()<<"buf2 size: "<<buf2.size();

            qint64 nsize = serial->write(buf2.toLatin1());
            serial->flush();        //必须加上,不然无论收端发送多少字节数据,收端只会触发一次接收槽函数!!!
            qDebug()<<"write big num size: "<<nsize;

            qDebug()<<"index i:"<<i;
           
        }
    }
      else {            //写小数据
        qint64 nsize = serial->write(waitSend.toLatin1());
        qDebug() << "wirte little size: "<<nsize;
    }
}

收端代码:

void MainWindow::Read_Data()
{
    int cnt = 0;
    serial->setReadBufferSize(0);
    QByteArray buf;
    while (serial->bytesAvailable()) {      
        qDebug()<<"wait to be read size:"<<serial->bytesAvailable();
        m_buffer.append(serial->readAll());
        buf.append(m_buffer);
        m_buffer.clear();
    }

    QString str = QString(buf);
    qDebug()<<"接收到的数据是: "<<buf;
    qDebug()<<"接收到的数据大小是: "<<buf.size();
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText();
        str+= buf;
       
        ui->textEdit->append(str);
    }
   
    ui->textEdit_2->append(str);
    qDebug()<<"str.size(): "<<str.size();
    cnt ++;
}

//发送端发送8K以内的数据,可保证收端原样收到,超出则只能收到8K之内的数据。(收端还有些bug,只能保证触发两次槽函数)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值