我創建了一個套接字來接收來自藍牙rfcomm套接字的數據。檢查藍牙插槽中緩衝區的狀態
如果收到的包裝件有10個編號,但有時我會收到單獨的零件。這取決於我選擇獲取數據的頻率。例如,如果我選擇1000Hz
,我會獲得所有信息。我使用的是QTimer
,因爲它得到一個int間隔1000毫秒/ 1000赫茲等於一個int,這是確定的。但是,如果除法不是整數,那麼QTimer
將舍入它,並且它不會及時重新啓動函數以獲取所有程序包,因爲它不同步。
我用這個,
sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
numb = read (sock, buf, 10);
如果麻木等於10包還行,所以我處理它。如果不是,只收到一部分。然後那部分丟失了。
有沒有辦法只檢查緩衝區是否已滿而不是已經讀取?即如果狀態已滿,則讀取它,如果沒有,則將其留給下一次迭代。
我不是這方面的專家,但是這個標誌MSG_EOR
能幫助我嗎?我的數據來自軟件包。
我是否應該將read
更改爲recv
? recv
獲取一個套接字作爲參數。
任何幫助將不勝感激。
所以,如果緩衝區不滿,它不會改變它。如果是,它會收到並閱讀它? – SamuelNLP 2013-02-28 16:31:47
不,你應該做一個_while loop_來檢查它是否已滿: 'while(numb!= 10){numb = recv(sock,buff,10,MSG_PEEK);睡眠(500); }' 但是正如我所看到的,你發現了一個好方法:_recv帶有標誌MSG_WAITALL_ – RIscRIpt 2013-02-28 19:26:39
使用標誌MSG_PEEK,你的輸入隊列(緩衝區)不會被改變,但它會被複制到你的緩衝區返回字節數複製。 有關[msdn](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms740121(v = vs.85).aspx)的更多信息, – RIscRIpt 2013-02-28 19:35:16