QT C++ 串口发送大数据

项目场景:

有时需要串口发送数据大量数据比如七八百个字节,收端需要接收数据后如何把数据给拼凑起来。
使用工具 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,只能保证触发两次槽函数)。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值