在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况。因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不保证一定是当前所发数据的起始部分。因此串口通信双方在通信前应制定好通信协议,规定好数据的起始和结束标志,串口当读到完整的起始和结束标志之后,才认定读完一条完整的数据。

本例中用串口定时发送当前时间,用"#"表示数据的结尾,定时时间为0毫秒,即能发多快就发多快。

//发送

  1. <span style="font-size:18px;">void Widget::slotSendData()
  2. {
  3. QByteArray temp;
  4. temp.append(getCurrentTime());
  5. temp.append("#");
  6. serialPort->write(temp);
  7. }</span>

//接收

  1. <span style="font-size:18px;">void Widget::slotReadData()
  2. {
  3. QByteArray temp = serialPort->readAll();
  4. if(!temp.isEmpty())
  5. {
  6. byteArray.append(temp);
  7. if(byteArray.contains("#"))
  8. {
  9. ui->textEditReceive->setText(byteArray.split('#').at(0));
  10. byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1);
  11. }
  12. }
  13. }</span>

源码链接:http://download.csdn.net/detail/caoshangpa/9464700

===============2016.10.14更新==============

补充一个通过串口传输图片的例子,这里假设波特率为9600,那么一秒钟就能传输9600/8=1200字节。代码中将定时器设置为1秒,所以选择的图片应该小于1200字节。这里为了演示如何完整接收数据,将图片按照指定大小分段发送,在每段之后紧接着发送字符串“###”。

代码如下所示:

  1. void Widget::slotSendData()
  2. {
  3. matrix.rotate(90);
  4. QPixmap tempPixmap = pixmap.transformed(matrix);
  5. QBuffer buffer;
  6. tempPixmap.save(&buffer,"jpg");
  7. ui->labelImage->setPixmap(tempPixmap);
  8. char *data=(char*)buffer.data().data();
  9. int dataLength=buffer.data().length();
  10. //打印图片大小
  11. qDebug()<<"Image Size:"<<dataLength;
  12. int standPacketSize=120;
  13. int packetSize=0;
  14. int packetNum=ceil(dataLength/120.0);
  15. if(dataLength>120)
  16. {
  17. for(int i=0;i<packetNum;i++)
  18. {
  19. if(standPacketSize*(i+1)<dataLength)
  20. {
  21. packetSize=standPacketSize;
  22. }
  23. else
  24. {
  25. packetSize=dataLength-standPacketSize*i;
  26. }
  27. serialPort->write(data,packetSize);
  28. data=data+packetSize;
  29. }
  30. }
  31. serialPort->write("###",3);
  32. }

运行效果如下图所示:

操作顺序1——》2——》3,左边的实例就会加载目录中的1.JPG并发送给右边的实例,图片每秒钟旋转90°。

源码链接:http://download.csdn.net/detail/caoshangpa/9653821

http://blog.csdn.net/caoshangpa/article/details/50915005

Qt串口通信接收数据不完整的解决方法(传输图片)的更多相关文章

  1. Qt串口通信接收数据不完整的解决方法

    在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...

  2. <QT障碍之路>qt中使用串口类接收数据不完整

    问题:当用QT中的serial->readAll()的时候,不会把全部的数据一次性都读取出来,而是阶段性的.原因是因为当串口有信号时候,readyRead()信号就会被抛出,那么一帧完整的数据帧 ...

  3. linux串口通信 接收信息不完整 读取不全

    类似这种 ready.o是我用来读取串口信息的一个程序 执行结果如下: [root@localhost testPlc]# ./ready.o 0 02 1 30 2 30 3 46 4 46 5 3 ...

  4. 【转】QT 串口QSerialPort + 解决接收数据不完整问题

    类:QSerialPort 例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在这上面修改就可以得到自己的串口软件.核心方法 // ...

  5. Qt 串口通信之使用16进制发送数据的转换方式

    Qt 串口通信之使用16进制发送数据的转换方式 一 概述 有时候在做上位机串口通讯时,经常需要将字符串转成16进制的形式作为发送,借此分析记录一下. 二 需求分析 //假设需要转换的字符:如下 QSt ...

  6. Qt串口通信

    1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...

  7. Qt 串口通信 高速发送出错的解决方法总结

    使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题:   问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...

  8. QT串口通信编程

    QT串口编程 文件夹目录结构如下图所示 设计的示例界面如下图所示 首先在项目文件里面添加一句 QT += serialport SerialPortDemo.pro文件如下: #----------- ...

  9. delphi SPCOMM 接收数据不完整!该如何解决

    SPCOMM 接收数据不完整!该如何解决   SPCOMM 接收数据不完整!我作了一个 读取地磅数据的程序,是用spcomm接收的! 总共有五台地磅,其他4台地磅数据读取都正常.但是有一台接收数据的时 ...

随机推荐

  1. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScri ...

  2. Javascript基本格式

    Javascript基本格式 ① JavaScript区分大小写 只要一门语言是面向对象的,其都是区分大小写,所以在Javascript中,变量小i与变量I是两个完全不同的变量 ② JavaScrip ...

  3. This bison version is not supported for regeneration of the Zend/PHP parsers

    在 mac 中编译 php-src.git 报错: configure: WARNING: This bison version is not supported , excluded: ). con ...

  4. DTCMS中文章增加tags标签和关键词时中文,替换为英文状态,

    DTCMS.Web\admin\article\article_edit.aspx 找到添加和修改的方法 model.tags = txtTags.Text.Trim()model.seo_keywo ...

  5. input onfocus onblur

    <input type="text" style="color:#999" value="账户" onfocus='if(this.v ...

  6. mcrypt加密与解密

    $key = 'test'; $result_array = array('name' => 'ta', 'age' => 28); $str = encode($result_array ...

  7. python学习之js从0开始

    <html> <head> <title>js页面</title> <script src="js/old_boy.js"&g ...

  8. AWK 介绍

    一.模式和动作 awk脚本是由模式和操作组成的:pattern {action} pattern与{action}两者是可选的.如果没有模式,则action应用到全部记录,如果没有action,则输出 ...

  9. 抄书(UVa714)

    Description   Before the invention of book-printing, it was very hard to make a copy of a book. All ...

  10. Throwing cards away I

    Throwing cards away I   Given is an ordered deck of n cards numbered 1 to n with card 1 at the top a ...