Я создал сокет для приема данных из сокета 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.
Любая помощь будет очень признательна.
Итак, если буфер не заполнен, он не изменит его. и если да, то он получит и прочитает его? – SamuelNLP
Нет, вы должны сделать _while loop_, чтобы проверить, заполнено ли оно: 'while (numb! = 10) {numb = recv (sock, buff, 10, MSG_PEEK); Сон (500); } ' Но, как я вижу, вы нашли хороший метод: _recv с флагом MSG_WAITALL_ – RIscRIpt
С флагом MSG_PEEK ваша входная очередь (буфер) не будет изменена, но она будет скопирована в ваш буфер, возвращая количество байтов скопировано. Вы можете узнать больше о [msdn] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121 (v = vs.85) .aspx) – RIscRIpt