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

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

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

发送


   
   
     
     
     
     
  1. void Widget::slotSendData()
  2. {
  3. QByteArray temp;
  4. temp.append(getCurrentTime());
  5. temp.append( "#");
  6. serialPort->write(temp);
  7. }
接收

   
   
     
     
     
     
  1. 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. }
源码链接: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:"<
  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
  18. {
  19. if(standPacketSize*(i+ 1)
  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




你可能感兴趣的:(Qt串口通信接收数据不完整的解决方法)