在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况。因为串口数据获取函数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. [Bootstrap]全局样式(五)

    辅助样式 1.情景文本色  .text-muted  .text-primary  .text-success  .text-info  .text-warning  .text-danger  {c ...

  2. NSS_03 过滤器

    asp.net mvc3有四类过滤器:授权, 操作,结果, 异常.操行的顺序为:授权,操作,结果,异常. 首先看一下TempData: 数据只能经过至多一次的Controller传递, 并且每个元素至 ...

  3. 基础学习总结(三)--文本、SD卡数据读写

    简单的文本数据写入文件不需要权限,读写SD卡在4.0版本前需要写权限.在4.0后需要读写权限 布局: <LinearLayout xmlns:android="http://schem ...

  4. discuz管理中心无法登陆

    检查下配置文件,当前管理是不是创始人. 如是,那试下修改数据库,在数据表出错时也会这样,还有一个也同时试下 \config\config_global.php 文件 $_config['admincp ...

  5. C#反编译工具 ILSPY-x64可动态调试-君临汉化版

    程序基于著名的ILSpy version 2.1.0.1603 汉化,并增加x64下debugging功能;初衷是网上只有一版是原作者留下的x86版本,实在不想在虚拟机里调试,只有自己动手弄一份x64 ...

  6. C# 获取中文星期的两种方法

    //方法一 public string Week() { string[] weekdays = { "星期日", "星期一", "星期二" ...

  7. win7 vs2008 激活

    参考:http://www.cnblogs.com/wgx0428/archive/2012/08/07/2627380.html win7需要管理员方式运行软件,才能看到输入框 软件:http:// ...

  8. Spark Streaming揭秘 Day22 架构源码图解

    Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...

  9. python--gevent协程及协程概念

    何为协程 协程,又称微线程.英文名Coroutine. 协程最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的 ...

  10. 开始学习python

    刚刚离开学校,到公司实习,发现所有的技术都是崭新的,所有的工具都是熟悉中带着陌生. 就像是孤身一人到了一个曾经只闻其名的偌大城市,看什么都觉得新鲜,做什么都心有畏惧.幸好 搞软件并没有那么多人情世故, ...