簡體   English   中英

QextSerialPort(QIODevice)的readyRead()信號調用得不夠快

[英]readyRead() signal of QextSerialPort (QIODevice) is not being called fast enough

我在Raspberry Pi上使用qextserialport與PanStamp(與Arduino兼容的設備)進行通信。

連接到Pi的PanStamp執行兩個功能:

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

我的架構是:

  • 集線器 :PanStamp + Raspberry Pi;
  • 衛星 :PanStamp +一些傳感器。

有兩種情況:

  • 衛星將數據無線發送到集線器。 在這種情況下,Pi每秒都會通過其串行端口接收大量數據;
  • 衛星關閉后,Pi每秒通過串行端口接收大約12個字節。

當衛星關閉時,不會在每次到達一個字節時都生成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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM