Qt串口通信接收數據不完整的解決方法(傳輸圖片)


    在使用串口接收數據時,當數據量大的時候會出現數據接收不完整的情況。因為串口數據獲取函數readAll()由readyRead()信號觸發,但readyRead()信號在串口讀到起始標志時立即發送,並不保證一定是當前所發數據的起始部分。因此串口通信雙方在通信前應制定好通信協議,規定好數據的起始和結束標志,串口當讀到完整的起始和結束標志之后,才認定讀完一條完整的數據。

    本例中用串口定時發送當前時間,用"#"表示數據的結尾,定時時間為0毫秒,即能發多快就發多快。

//發送

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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>  

//接收

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">void Widget::slotReadData()  
  2. {  
  3.     QByteArray temp = serialPort->readAll();  
  4.   
  5.     if(!temp.isEmpty())  
  6.     {  
  7.         byteArray.append(temp);  
  8.         if(byteArray.contains("#"))  
  9.         {  
  10.             ui->textEditReceive->setText(byteArray.split('#').at(0));  
  11.             byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1);  
  12.         }  
  13.     }  
  14. }</span>  

源碼鏈接:http://download.csdn.net/detail/caoshangpa/9464700

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

補充一個通過串口傳輸圖片的例子,這里假設波特率為9600,那么一秒鍾就能傳輸9600/8=1200字節。代碼中將定時器設置為1秒,所以選擇的圖片應該小於1200字節。這里為了演示如何完整接收數據,將圖片按照指定大小分段發送,在每段之后緊接着發送字符串“###”。

代碼如下所示:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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.   
  9.     char *data=(char*)buffer.data().data();  
  10.     int dataLength=buffer.data().length();  
  11.     //打印圖片大小  
  12.     qDebug()<<"Image Size:"<<dataLength;  
  13.     int standPacketSize=120;  
  14.     int packetSize=0;  
  15.     int packetNum=ceil(dataLength/120.0);  
  16.   
  17.     if(dataLength>120)  
  18.     {  
  19.         for(int i=0;i<packetNum;i++)  
  20.         {  
  21.             if(standPacketSize*(i+1)<dataLength)  
  22.             {  
  23.                 packetSize=standPacketSize;  
  24.             }  
  25.             else  
  26.             {  
  27.                 packetSize=dataLength-standPacketSize*i;  
  28.   
  29.             }  
  30.   
  31.             serialPort->write(data,packetSize);  
  32.             data=data+packetSize;  
  33.         }  
  34.     }  
  35.   
  36.     serialPort->write("###",3);  
  37. }  

 

運行效果如下圖所示:

操作順序1——》2——》3,左邊的實例就會加載目錄中的1.JPG並發送給右邊的實例,圖片每秒鍾旋轉90°。

 

源碼鏈接:http://download.csdn.net/detail/caoshangpa/9653821

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM