2013-02-25 4 views
0

Я создал сокет для приема данных из сокета rfcomm в bluetooth.Проверить состояние буфера в сокете Bluetooth

Пакеты, если они получены в одной части, имеют 10 номеров, но иногда я получаю отдельные части. Это зависит от частоты, которую я выбираю для получения данных. Например, если я выберу 1000Hz, я получу всю информацию. Я использую QTimer, и поскольку он получает int как интервал 1000 мс/1000 Гц, равен int, что нормально. Но если деление не является int, то QTimer будет округлять его, и он не перезапустит функцию вовремя, чтобы получить весь пакет по мере его десинхронизации.

Я использую это,

sock = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 

numb = read (sock, buf, 10); 

Если онемение равно 10 пакет был ОК, так что я его обработать. Если нет, часть была получена. Затем эта часть теряется.

Есть ли способ проверить, заполнен ли буфер, а не читать? То есть Если состояние, если оно заполнено, прочитайте его, если нет, оставьте его на следующей итерации.

Я не эксперт в этом вопросе, но может ли флаг MSG_EOR помочь мне? Мои данные приводятся в пакетах.

Должен ли я изменить read на recv? recv получает параметр socket.

Любая помощь будет очень признательна.

ответ

0

Ну, я проработал сам.

Будучи каждый пакет 10 bytes, я изменил buffer размер, чтобы иметь размер frequency * 10 bytes, чтобы он мог получить вторую приобретения и поэтому я могу иметь QTimer с интервалом в одну секунду.

1

Есть ли способ проверить, заполнен ли буфер, а не читать его уже?

Вы можете попробовать использовать ПРИЕМ с флагом MSG_PEEK. С этим флагом recv работает одинаково, но не удаляет входные данные из очереди.

+0

Итак, если буфер не заполнен, он не изменит его. и если да, то он получит и прочитает его? – SamuelNLP

+0

Нет, вы должны сделать _while loop_, чтобы проверить, заполнено ли оно: 'while (numb! = 10) {numb = recv (sock, buff, 10, MSG_PEEK); Сон (500); } ' Но, как я вижу, вы нашли хороший метод: _recv с флагом MSG_WAITALL_ – RIscRIpt

+0

С флагом MSG_PEEK ваша входная очередь (буфер) не будет изменена, но она будет скопирована в ваш буфер, возвращая количество байтов скопировано. Вы можете узнать больше о [msdn] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121 (v = vs.85) .aspx) – RIscRIpt

0

Еще один способ решить мою проблему - переиграть функцию read() с помощью recv() и добавить флаг MSG_WAITALL.

Смежные вопросы