問題:當用QT中的serial->readAll()的時候,不會把全部的數據一次性都讀取出來,而是階段性的。原因是因為當串口有信號時候,readyRead()信號就會被拋出,那么一幀完整的數據幀就可能被分多次接收進來,會影響一些后續的操作。
解決方法:
1.通訊雙方提前定義好幀頭和幀尾,方便進行校驗。當檢測到到幀頭和幀尾,才認定一幀數據時完整的。
2.在readyRead()信號拋出后,再readAll()函數前使用延時函數,等待一幀數據完全發送完成。
1 /* 以下只是部分代碼 */ 2 #include <QTimer> 3 4 int main() 5 { 6 QTimer *timer = new QTimer(); 8 connect(timer, SIGNAL(timeout()), this, SLOT(timerStop())); 9 } 10 11 void Dialog::timerStop(void) 12 { 13 g_RecBuf.prepend(0xBB); 14 timer->stop(); 15 { 16 qDebug()<<g_RecBuf; 17 Dialog::saveDataToFile(g_RecBuf); 18 } 19 g_RecBuf.clear(); 20 } 21 22 void Dialog::readParam() 23 { 24 timer->start(100); 25 g_RecBuf.append(serial->readAll()); 26 }