2013-08-06 25 views
2

我在Raspberry Pi上使用qextserialport與PanStamp(Arduino兼容設備)進行通信。QextSerialPort(QIODevice)的readyRead()信號調用不夠快

這PanStamp連接到裨執行兩個功能:

  • 發送一些傳感器的讀數,每個第二(約12字節);
  • 通過無線鏈接發送所有收到的數據(約60字節,每秒約6次)。

我的體系結構是:

  • 集線器:PanStamp +樹莓裨;
  • 衛星:PanStamp +一些傳感器。

有兩種情況:上發送數據wirelessy到集線器

  • 衛星。在這種情況下,Pi每秒都會通過串口接收大量數據;
  • 衛星關閉時,Pi每秒通過串口接收約12個字節。

當衛星是關閉readyRead()信號不產生每一個字節到達的時間和它的驅動器我的程序,其中每個數據分組中的緩衝器讀出一個或多個停留一個「不同步」狀態(即不斷增長)。

但是,當我打開衛星並且Pi開始接收大量數據時,這個「不同步」情況消失,出現一陣數據(緩衝區增長得更快並且被佔用後),並且我的程序啓動「實時」工作。

這裏是我的程序的輸出的一個例子:www.tiago.eti.br/storage/iSEDE.log

,你可以在日誌中可用的字節數不斷增加中所看到的和發送數據開始HUB:沒有被處理的每一秒每一秒(線有開頭的時間戳)。一段時間後有一個爆發(衛星已打開),並且每秒處理大量數據,開始處理衛星的數據(以8開始的行),緩衝區被清空,我的程序開始處理數據實時」。

那麼我能做些什麼來避免緩衝區增長過多而不會丟失數據呢? 當緩衝區大於100字節時,我試圖調用連接到readyRead()的函數,但它創建了一個混亂,我開始丟失一些數據包。

+0

請張貼一些代碼,你寫在'QIODevice'閱讀特別的東西。 –

+0

你爲什麼不使用QtSerialPort? – lpapp

+0

是的,當我第一次使用串行端口(幾年前)與Qt QtSerialPort不可用時,所以我用我已經知道的。 –

回答

4

你的問題出在人們用QIODevice做的最常見的錯誤上..你錯誤地認爲readyRead是在每個字節上調用的,並且說如果它像那樣工作的話它會完全錯誤。想法是,每次你收到一個readyRead有SOMETHING從設備讀取..它可以是1個字節,10個字節,1K ..等等。簡單地說,它的做法就是儘量減少CPU負載的情況下塊傳輸以及在硬件上讀取塊中的數據,而不是字節。

所以你應該做的就是調用readAll()來獲得所有可用的數據,並以你喜歡的方式處理它們。

你可能想在here看看..

相關問題