Qt串列埠接收資料長度不穩定問題

2021-08-09 02:29:46 字數 748 閱讀 8136

最近在做乙個實時接收資料的專案,需要每2ms接收下位機發來的兩幀資料,算是串列埠高速接收。

在使用的過程中,發現串列埠接收的資料長度不穩定,有時長有時短。

**如下:

connect(serial,signal(readyread()),this,slot(serial_receive()));

然後在槽函式裡

serial->read(all);
發現讀出來的資料竟然遠遠超過了兩幀,於是改用

serial->read(2);
這次讀出來的資料依舊不穩定,例如我要的資料是0x02,0xff。有時候讀出來確是0x02,0x00。

經過我的思考,我認為原因並不是這樣的,readyread函式確實是一收到資料就會觸發槽函式,而資料長度不穩定的原因就在於,串列埠接收資料並不會等你槽函式處理完之後才繼續接收,有可能在你進入槽函式時串列埠便又接收了好幾個資料(這會出現在高速接收的情況下,而且我認為此時不會重複觸發槽函式,原理應該和無法中斷巢狀差不多),這時如果使用readall的話,接收的長度自然是不穩定的,無法保證串列埠在這段時間內又接收到了多少資料,這也就解釋了為什麼我用read(2)時會出現後面的資料為00的情況,因為readready觸發的條件是接收乙個資料,而我卻讀了兩個,我無法保證在這麼短的時間內串列埠能接收到下乙個資料,但實驗結果證明其實大部分時間是可以的,但會有30%左右的概率會使我read的動作超前於接收的動作,因此出現了後面的資料為0的情況。

實際解決方法:使用乙個迴圈鍊錶,判斷包頭包尾

效能資料不穩定因素

ceph 作為軟體定義儲存的代表之一,最近幾年其發展勢頭很猛,也出現了不少公司在測試和生產系統中使用 ceph 的案例,儘管與此同時許多人對它的抱怨也一直存在。特別是進行效能測試。我們在進行效能測試時經常會發現效能資料不穩定的現象,尤其是伺服器使用的是帶有cache的raid卡。比如在使用30個7....

DBSCAN聚類效果不穩定問題

dbscan聚類演算法含義 dbscan聚類引數主要有這兩個 eps 和 min s dbscan調參視覺化部分 測試調參部分 mask test1 np.zeros shape round 1.0 0.05 0.05 round 1500 50 50 dtype np.float32 mask t...

部分新iPhone出現訊號不穩定問題 不如老機器

程式設計驛站 chinaz.com 9月27日 訊息 去年,蘋果推出了iphone x之後,有部分使用者反應其訊號出現了不穩定的情程式設計客棧況。蘋果隨之通過ios軟體的更新進行了多次修復。然而今年最新一代ipho推出之後,也並沒有避ysxmzhdnn免 訊號門 的問題。近日,有國外 反應,部分國外...