2014-09-01 21 views
3

我目前有一個問題。我正在嘗試寫一個實時繪圖程序。我從Arduino接收數據。我可以成功打開串口並正確讀取信息並繪製圖表。問題是,如果我沒有指定緩衝區大小,輸入緩衝區被認爲是無限的(現在以300Hz-4800Hz讀取數據,你可以想象你的計算機的內存可能會最終填滿並且一切都崩潰了!)。QSerialPort - setReadBufferSize

現在我已經試過類似:

serial->setReadBufferSize(5000); 

現在這併成功地設置緩衝區的大小,我用serial->readBufferSize()確認是否它的工作與否。

問題是一旦緩衝區已滿,程序停止繪圖。現在,我想我應該做的是:

  1. 設置緩衝區的大小(僅一次)
  2. 讀串口
  3. 圖中的數據
  4. 清除緩衝區(serial->明確的()) 。

重複步驟2 - 4

但這似乎並沒有工作。

我正在利用QCustomPlot做實時繪圖。

+2

讀取串行數據將其從緩衝區中刪除。我不明白你的問題。如果您讀取數據的速度比接收數據的速度快,則緩衝區不應該填滿。如果不是,請使用RS232流量控制。你爲什麼要清除緩衝區?這隻會丟棄數據。 – 2014-09-01 03:26:03

回答

2

您可以以異步方式讀取數據。只需將信號QSerialPort連接到一個插槽即可。 readyRead()發射每當新的數據可用:

connect(&serial, SIGNAL(readyRead()), this, SLOT(readData())); 

readData()是一個被稱爲每次QSerialPort發射readyRead()信號槽。 readData()將任何可用數據附加到QByteArray類成員。您可以在此插槽檢查特定的數據量是否已受理:

void MyClass::readData() 
{ 
    receivedData.append(serial.readAll()); 

    if(receivedData.count()>=5000) 
    { 
     //Plot data and remove plotted data from receivedData 
    } 
} 
+0

你好Nejat,謝謝你的迴應。爲了解決我的問題,我最終做了類似於你的建議。我只是去if(serial-> size()> = 10000) serial-> clear(); 現在我的串行緩衝區每次都會清除。 – skandebaba 2014-09-25 03:48:08

0

確保您serial.waitForReadyRead是不是很小。

serial.waitForReadyRead(50) 

50 ms適用於我。

相關問題