找回密码
 立即注册
收起左侧

写了一个工具,打开二进制文件很慢,串口收数据越来卡

0
回复
7332
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2017-9-17 15:31:35 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 amc 于 2017-9-18 14:53 编辑

写了一个工具,连接好串口助手后,短接串口收发,打开二进制文件(打开一张200k jpg图片速度很慢),以16进制显示。发送到串口,16进制显示,越往后速度越慢。
下面是代码,传百度云了,请大神们看看,为啥打开慢,接收显示越来越卡
百度网盘下载地址
测试文件下载地址

代码都是东拼西凑的,网上找的,有点乱,大家多多包涵
开发环境:qt5.9                 win10

我测试打开文件的时候,卡在了ui->textEdit->insertPlainText (*tempStr);这里,有没有什么好的方法可以加快显示速度?          接收的时候,应该是ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);这里的问题,改成
                                         ui->textBrowser->setText(buf);就不会卡了,请问这里有什么办法优化没?

代码:


  1. //读串口接收数据
  2. void MainWindow::readData()
  3. {
  4. //    QByteArray data = serial->readAll();

  5. //    console->putData(data);
  6.     QByteArray temp = serial->readAll();
  7.     QString buf;


  8. //        if(!temp.isEmpty())
  9. //        {
  10. //            buf = temp;

  11. //            ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);
  12. //            ui->textBrowser->moveCursor(QTextCursor::End);
  13. //        }
  14.         if(!temp.isEmpty()){
  15. //                if(chrReceive->isChecked()){
  16. //                    buf = temp;
  17. //                }else if(hexReceive->isChecked()){
  18.                     for(int i = 0; i < temp.count(); i++){
  19.                         QString s;
  20.                         s.sprintf("%02X ", (unsigned char)temp.at(i));
  21.                         buf += s;
  22.                     }
  23. //                }
  24.             ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);
  25.             ui->textBrowser->moveCursor(QTextCursor::End);


  26. //            //ui->statusBar->showMessage(tr("成功读取%1字节数据").arg(temp.size()));
  27.         }

  28. }
复制代码

  1. //打开文件,并发送
  2. void MainWindow::on_openFileButton_clicked()
  3. {
  4.     //get file name
  5.     QString fileName = QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath());
  6. //    qDebug()<< "fileName is" << fileName;
  7.     ui->filePathLineEdit->setText (fileName);
  8.     if(fileName.isEmpty())
  9.     {
  10.         QMessageBox::information(this,"Error Message", "Please Select a Text File");
  11.         return;
  12.     }
  13.     QFileInfo *pcsfileInfo = new QFileInfo(fileName);
  14.     binSize = pcsfileInfo->size ();

  15.     QFile* file = new QFile;
  16.     file->setFileName(fileName);
  17.     bool ok = file->open(QIODevice::ReadOnly);
  18.     if(ok)
  19.     {
  20. //        QTextStream in(file);
  21. //        ui->textEdit->setText(in.readAll());//read all context from the file
  22.     }
  23.     else
  24.     {
  25.         QMessageBox::information(this,"Error Message", "File Open Error" + file->errorString());
  26.         return;
  27.     }
  28.     QDataStream in(file);
  29.     char * binByte = new char[binSize];
  30.     in.setVersion (QDataStream::Qt_5_9);

  31.     in.readRawData (binByte, binSize);      //读出文件到缓存

  32.     QByteArray *tempByte = new QByteArray(binByte, binSize);                //格式转换
  33.     delete[] binByte;
  34.     QString *tempStr = new QString(tempByte->toHex ().toUpper ());
  35. //    delete tempByte;

  36.     //显示文件内容
  37.     qint8 cnt = 1;
  38.     qint16 kcnt = 0;
  39.     for(qint64 i = 2; i < tempStr->size ();)
  40.     {
  41.         tempStr->insert (i, ' ');//每个字节之间空一格
  42.         i += 3;
  43.         cnt++;
  44.         if(cnt == 8)//每8个字节空2格
  45.         {
  46.             tempStr->insert (i, ' ');
  47.             i += 1;
  48.         }
  49.         if(cnt == 16)//每16个字节空一格
  50.         {
  51.             cnt = 1;
  52.             kcnt ++;
  53.             if(kcnt == 64)//每64行,即1K数据,空一行
  54.             {
  55.                 kcnt = 0;
  56.                 tempStr->insert (i, '\n');
  57.                 i++;
  58.             }
  59.             tempStr->insert (i, '\n');
  60.             i += 3;         //避免换行后开头一个空格,换行相当于从新插入
  61.         }

  62.     }
  63.     ui->textEdit->insertPlainText (*tempStr);
  64.     serial->write(*tempByte);

  65.     delete tempByte;
  66.     delete tempStr;

  67.     file->close ();
  68.     delete file;
  69. }
复制代码





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了