Проверьте состояние буфера в разъеме Bluetooth

Я создал сокет для получения данных от сокета rfcomm в Bluetooth.

Пакеты, если они получены одним куском, имеют 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 получает сокет в качестве параметра.

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

0

Решение

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

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

1

Другие решения

Ну, я решил это сам.

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

0

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

0
По вопросам рекламы [email protected]