在使用串口接收數據時,當數據量大的時候會出現數據接收不完整的情況。因為串口數據獲取函數readAll()由readyRead()信號觸發,但readyRead()信號在串口讀到起始標志時立即發送,並不保證一定是當前所發數據的起始部分。因此串口通信雙方在通信前應制定好通信協議,規定好數據的起始和結束標志,串口當讀到完整的起始和結束標志之后,才認定讀完一條完整的數據。
本例中用串口定時發送當前時間,用"#"表示數據的結尾,定時時間為0毫秒,即能發多快就發多快。
//發送
- <span style="font-size:18px;">void Widget::slotSendData()
- {
- QByteArray temp;
- temp.append(getCurrentTime());
- temp.append("#");
- serialPort->write(temp);
- }</span>
//接收
- <span style="font-size:18px;">void Widget::slotReadData()
- {
- QByteArray temp = serialPort->readAll();
- if(!temp.isEmpty())
- {
- byteArray.append(temp);
- if(byteArray.contains("#"))
- {
- ui->textEditReceive->setText(byteArray.split('#').at(0));
- byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1);
- }
- }
- }</span>
源碼鏈接:http://download.csdn.net/detail/caoshangpa/9464700
===============2016.10.14更新==============
補充一個通過串口傳輸圖片的例子,這里假設波特率為9600,那么一秒鍾就能傳輸9600/8=1200字節。代碼中將定時器設置為1秒,所以選擇的圖片應該小於1200字節。這里為了演示如何完整接收數據,將圖片按照指定大小分段發送,在每段之后緊接着發送字符串“###”。
代碼如下所示:
- void Widget::slotSendData()
- {
- matrix.rotate(90);
- QPixmap tempPixmap = pixmap.transformed(matrix);
- QBuffer buffer;
- tempPixmap.save(&buffer,"jpg");
- ui->labelImage->setPixmap(tempPixmap);
- char *data=(char*)buffer.data().data();
- int dataLength=buffer.data().length();
- //打印圖片大小
- qDebug()<<"Image Size:"<<dataLength;
- int standPacketSize=120;
- int packetSize=0;
- int packetNum=ceil(dataLength/120.0);
- if(dataLength>120)
- {
- for(int i=0;i<packetNum;i++)
- {
- if(standPacketSize*(i+1)<dataLength)
- {
- packetSize=standPacketSize;
- }
- else
- {
- packetSize=dataLength-standPacketSize*i;
- }
- serialPort->write(data,packetSize);
- data=data+packetSize;
- }
- }
- serialPort->write("###",3);
- }
運行效果如下圖所示:
操作順序1——》2——》3,左邊的實例就會加載目錄中的1.JPG並發送給右邊的實例,圖片每秒鍾旋轉90°。
源碼鏈接:http://download.csdn.net/detail/caoshangpa/9653821
http://blog.csdn.net/caoshangpa/article/details/50915005