2017-01-04 93 views
0

我已經在這裏看過關於這個主題的幾個問題,但沒有提供給我一個解決方案。QT串行丟棄數據

通過VM測試,我有傳入的數據,長度爲47,80或31個字符。

串口的readyRead連接:

void MainWindow::readData(){ 
    QString buf; 
    myByteArray = serial->readAll(); 
    for(int i = 0; i < myByteArray.size(); ++i){ 
     if(myByteArray.at(i) == '\n'){ 
      buf.append(myByteArray.at(i)); 
      qDebug() << buf << endl; 
      buf.clear(); 
     else{ 
      buf.append(myByteArray.at(i)); 
     } 

我知道,每一個消息,一個結尾爲「\ r \ n」,所以我們使用它作爲一個點來結束當前的消息。

我遇到的問題是,我可能每隔50分鐘就會收到一封乾淨的信息。它會左右拖放字符。我有一個文本文件顯示消息是通過串口發送的,所以我可以比較接收到的消息,並且它很糟糕。

我試過readLine()以及其他線程中的其他一些建議,它總是相同的結果。

我的想法是檢查收到的信息是否與我期望的長度一致,47,80或31個字符,然後忽略那些不匹配的信息。這個問題是,我會每隔2分鐘收到一封實際的清潔郵件....也許。

如果我將所得到的數據轉儲出來,結果實際上與緩衝數據時沒有什麼不同。

我遇到的另一個問題是我收到的每封郵件,我完全想念約3-4。

有關如何更好地處理此問題的任何建議?

回答

1

readAll返回當前可用的任何東西。無法保證所有數據都已收到。我的猜測是,當你打電話時,你的數據仍在傳輸中。

您需要閱讀數據直到您收到\r\n

根據您的需要,您可能會發現readLine更易於使用。

+0

唯一一致的是\ n字符的接收。我可以看到郵件的開頭是收到的,最後,但是中間是字符丟失的地方。 我已經嘗試了readAll和readLine,它的結果相對相同。 我知道完整的消息正在發送,我只是沒有通過這個串口收到它。 我的下一線追索權是什麼? – bauervision

+0

@bauervision這是一個重要的信息:它屬於問題本身。您需要說服我們確實只接收部分消息:例如使用'qDebug()<< line.toHex();',其中行來自'readLine'。也許你沒有使用流量控制,並且你在某個地方超出了緩衝區。最有可能的是,你需要展示一個演示問題的最小代碼示例。 –

+0

波特率= 38400,數據位= 8,無奇偶校驗,一站式,無流量控制 這些是從管理員給予我的設置,不確定是否在我的末端更改它會很重要,或者它會斷開連接。只是還不夠了解這個東西。 – bauervision