我在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()
的函數,但它創建了一個混亂,我開始丟失一些數據包。
請張貼一些代碼,你寫在'QIODevice'閱讀特別的東西。 –
你爲什麼不使用QtSerialPort? – lpapp
是的,當我第一次使用串行端口(幾年前)與Qt QtSerialPort不可用時,所以我用我已經知道的。 –