Я создал сокет для получения данных от сокета 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
получает сокет в качестве параметра.
Любая помощь будет принята с благодарностью.
Есть ли способ проверить, заполнен ли буфер, а не читать его уже?
Вы можете попробовать использовать RECV с флагом MSG_PEEK. С этим флагом RECV работает так же, но не удаляет входные данные из очереди.
Ну, я решил это сам.
Быть в каждой упаковке 10 bytes
Я изменил buffer
размер, чтобы иметь размер frequency * 10 bytes
так что он может получить секунду приобретения, и поэтому я могу иметь QTimer
с интервалом в одну секунду.
Еще один способ решить мою проблему — воспроизвести read()
функция с recv()
и добавив флаг MSG_WAITALL
,