2013-02-25 48 views
0

我創建了一個套接字來接收來自藍牙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更改爲recvrecv獲取一個套接字作爲參數。

任何幫助將不勝感激。

回答

0

嗯,我工作了我的自我。

作爲每個包10 bytes,我改變了buffer尺寸以具有frequency * 10 bytes大小,以便它可以接收採集的第二和,所以我可以有QTimer與一秒的間隔。

1

有沒有辦法只檢查緩衝區是否已滿而不是已經讀取?

您可以嘗試使用帶有標誌MSG_PEEK的recv。使用此標誌recv的工作方式相同,但不會從隊列中刪除輸入數據。

+0

所以,如果緩衝區不滿,它不會改變它。如果是,它會收到並閱讀它? – SamuelNLP 2013-02-28 16:31:47

+0

不,你應該做一個_while loop_來檢查它是否已滿: 'while(numb!= 10){numb = recv(sock,buff,10,MSG_PEEK);睡眠(500); }' 但是正如我所看到的,你發現了一個好方法:_recv帶有標誌MSG_WAITALL_ – RIscRIpt 2013-02-28 19:26:39

+0

使用標誌MSG_PEEK,你的輸入隊列(緩衝區)不會被改變,但它會被複制到你的緩衝區返回字節數複製。 有關[msdn](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms740121(v = vs.85).aspx)的更多信息, – RIscRIpt 2013-02-28 19:35:16

0

解決我的問題的另一種方法是使用recv()重放read()函數並添加標記MSG_WAITALL