Получение данных по Bluetooth
- Войдите на сайт для отправки комментариев
Ср, 05/06/2019 - 22:42
Все доброго времени суток, есть у меня 2 платы и 2 Bluetooth модуля, хочу обеспечить корректную передачу данных между ними, поэтому мне и нужна ваша помощь.
Это код для передачи данных
uint8_t* pstrac = (uint8_t*)&strac; // указатель на структуру for(size_t i = 0; i < sizeof(strac); i++){ SoftSerial.write(*pstrac++); } }
С кодом выше проблем вроде как нет.
Это код для получения данных
uint8_t* pparsestract = (uint8_t*)&parsestract; // указатель для структуры for(size_t i = 0; i < sizeof(parse);i++){ parseVal = twoPoint.read(); // читаем значение с блютуза и записываем в переменную delay(80); // кастыль (*pparsestract++) = parseVal; }
А вот этот код держится на ненадежном кастыле, он нужен для того чтобы в значение структуры не записывалось 0xffff, это значение образуется в тот момент когда функция read() не имеет нечего на своем входе, но даже с кастылем 0xffff все таки просачивается (даже если повысить скорость задержки).
Думая я достаточно изложил свою проблему.
Заранее всех благодарю.
Нет?
Я пробывал вроде такого, но в другом ключе, вотконкрктно этот пример кажется рабочим.
Это решение не работает.
Попробуйте добавить в данные какой нибудь маркер начала пакета и сбрасывайте счетчик или указатель по нему (да и маркер конца бы не помешал с контрольной суммой, как получили и посчитали - выставляем флаг готовности данных и только если он есть данные в структуре верны).
Это решение работает именно для озвученной проблемы.
0xffff - это то, что возвращает read(), когда available() == 0. А точнее - (int) -1.
Так что надо отсеивать или одним или другим способом.
...А вот этот код держится на ненадежном кастыле, он нужен для того чтобы в значение структуры не записывалось 0xffff, это значение образуется в тот момент когда функция read() не имеет нечего на своем входе, но даже с кастылем 0xffff все таки просачивается (даже если повысить скорость задержки).
0xffff проскакивает 1 раз или же есть последовательность из 0xffff?
Допускаете такую возвозможность, что Ваша структура может быть не выровнена? Ради интереса поиграйтесь просто с линейным массивом.
Проскакивание происходит единичное, а отправные и принемающие структуры выровнены по типу
К слову все данные в структуре относятся к 1 типу uint8_t
Тогда попробуйте исключить BT - напрямую, проводами соедините передатчик и приемник (rx, tx, gnd).
Ваш вариант работатет только не в том виде как вы его представили
Этот вариант не пропускает злаполучную -1, но данные расшифрововаются не в том порядке.
Эту проблему решает мой кастыль
Ну так инкремент счётчику надо делать по принятию байта, а не херачить в цикле, тупо пропуская половину. Но если подходит костыль - то пользуйтесь, конечно.
Этот вариант не пропускает злаполучную -1
Посмотрите на класс twoPoint. Наверняка, "-1" некий код возвращения ошибки. Если так, то тупо пропускайте, если twoPoint.read<0. Правильнее, запрашивать новый пакет и вввести CRC на целостность передаваемого пакета (структуры).
Кажется, вот в чем дело. Вы делаете попытку копирования всего массива, размером sizeof(parse) по наличию хотябы одного байта в принятом буфере, но Вы не знаете каков размер принятой информации в twoPoint и он наверняка меньше, чем Вы пытаетесь прочесть. Поэтому, twoPoint и выдает ошибку "-1". Надо ждать пока не будут полученны данные или же делать контроль по размеру принятых данных и только потом копировать и парсить.
Костыль не совсем "костыль". :)