Qt串口通信接收数据不完整的解决方法(传输图片)

在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况。因为串口数据获取函数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. }

运行效果如下图所示:

Qt串口通信接收数据不完整的解决方法(传输图片)

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

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

Qt串口通信接收数据不完整的解决方法(传输图片)

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

上一篇:Hyper V NAT 网络设置 固定IP / DHCP


下一篇:Linux访问Windows磁盘实现共享