最近在裝置的測試工裝時,通過串列埠,向裝置傳送自定義規約,其報文的枕結構已經編寫,使用串列埠助手除錯,裝置可正常回復,但是通過工裝,接收報文會不完整,導致解析失敗。使用qDebug打印出來卻發現數據被分成了兩部分甚至更多部分依次列印,之後通過驗證確定了問題出在readyRead的訊號與槽這一部分,當回覆報文位元組較多,報文會進行分幀。

其實可以搜到,解決方法有很多種,比如:通過資料的幀頭幀尾,以及某個位元組的特殊判斷,進行判斷是否為完整資料幀、通過幀頭和資料幀長來判斷完整幀,然後使用定時器增加重發機制,或者使用定時器將延時讀取的資料存入緩衝區,定時時間到後,再一次性讀取資料。

下面介紹其中一方法,其實類似,並沒有多大區別:

在對應類的標頭檔案中:

private:

QTimer *waitTime;

再進行具體編寫

waitTime = new QTimer;

connect(pserialport,&QSerialPort::readyRead,this,[=]()

{

waitTime->start(200);

pbuf.append(pserialport->readAll());

});

connect(waitTime,&QTimer::timeout,this,&MainWindow::showRecvData);

這是接收的報文會自動存入緩衝區儲存,最後組成完整的一條報文進行解析或者按照你所寫的處理。




            connect(waitTime,&QTimer::timeout,this,&MainWindow::showRecvData);