[英]readyRead() signal of QextSerialPort (QIODevice) is not being called fast enough
我在Raspberry Pi上使用qextserialport與PanStamp(與Arduino兼容的設備)進行通信。
連接到Pi的PanStamp執行兩個功能:
我的架構是:
有兩種情況:
當衛星關閉時,不會在每次到達一個字節時都生成readyRead()
信號,它會將我的程序驅動到“不同步”狀態,在該狀態下,每個數據包讀取的一個或多個數據都保留在緩沖區中(並保持增長)。
但是,當我打開衛星並且Pi開始接收大量數據時,這種“不同步”狀態消失了,出現了數據突發(緩沖區增長得更快,之后被清空),並且我的程序開始在即時的”。
這是程序輸出的一個示例: www.tiago.eti.br/storage/iSEDE.log
正如您在日志中看到的那樣,可用字節不斷增加,並且數據每秒發送一次(以HUB:
開頭的行HUB:
每秒未處理。開頭有一個時間戳)。 有一陣子后(衛星已打開)並且每秒處理大量數據,開始處理衛星數據(以8
開頭的行),清空緩沖區,我的程序開始處理數據實時”。
那么,如何避免緩沖區增長過多並且不丟失數據呢? 我試圖在緩沖區大於100字節時調用連接到readyRead()
的函數,但它造成了混亂,並且我開始丟失一些數據包。
您的問題是人們使用QIODevice時常犯的最常見錯誤。您錯誤地假定在每個字節上調用readyRead,並說如果這樣做就完全是錯誤的。 想法是,每次接收readyRead也有一些是從所述設備讀取時間..它可以是1個字節,10個字節,每千..等。在簡單的話對其做像那樣在數據塊傳輸的情況下,最小化CPU負載以及在硬件上以塊而不是字節為單位讀取數據。
因此,您應該做的是調用readAll()以獲取所有到達的可用數據,並以您喜歡的方式對其進行處理。
您可能想在這里看看..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.