Получение данных по Bluetooth

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Все доброго времени суток, есть у меня 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 все таки просачивается (даже если повысить скорость задержки).

Думая я достаточно изложил свою проблему.

Заранее всех благодарю. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016
if (0x00 < twoPoint.available()) {
...
    (*pparsestract++) = parseVal;
...
}

Нет?

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Я пробывал вроде такого, но в другом ключе, вотконкрктно этот пример кажется рабочим.

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Это решение не работает.

Morroc
Offline
Зарегистрирован: 24.10.2016

Попробуйте добавить в данные какой нибудь маркер начала пакета и сбрасывайте счетчик или указатель по нему (да и маркер конца бы не помешал с контрольной суммой, как получили и посчитали - выставляем флаг готовности данных и только если он есть данные в структуре верны).

sadman41
Offline
Зарегистрирован: 19.10.2016

Это решение работает именно для озвученной проблемы.

0xffff - это то, что возвращает read(), когда available() == 0. А точнее - (int) -1.

Так что надо отсеивать или одним или другим способом.

qbit
Offline
Зарегистрирован: 18.03.2019

MsFedkin пишет:

...А вот этот код держится на ненадежном кастыле, он нужен для того чтобы в значение структуры не записывалось 0xffff, это значение образуется в тот момент когда функция read() не имеет нечего на своем входе, но даже с кастылем 0xffff все таки просачивается (даже если повысить скорость задержки).

0xffff проскакивает 1 раз или же есть последовательность из 0xffff?

Допускаете такую возвозможность, что Ваша структура может быть не выровнена? Ради интереса поиграйтесь просто с линейным массивом.

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Проскакивание происходит единичное, а отправные и принемающие структуры выровнены по типу



#pragma pack(push,1)
typedef struct {

....

}a;
#pragma pack(pop)

К слову все данные в структуре относятся к 1 типу uint8_t

qbit
Offline
Зарегистрирован: 18.03.2019

Тогда попробуйте исключить BT - напрямую, проводами соедините передатчик и приемник (rx, tx, gnd).

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Ваш вариант работатет только не в том виде как вы его представили 

if(twoPoint.available())parseVal = twoPoint.read();

Этот вариант не пропускает злаполучную -1, но данные расшифрововаются не в том порядке. 

Эту проблему решает мой кастыль 

delay(60);// кастыль

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну так инкремент счётчику надо делать по принятию байта, а не херачить в цикле, тупо пропуская половину. Но если подходит костыль - то пользуйтесь, конечно.

qbit
Offline
Зарегистрирован: 18.03.2019

MsFedkin пишет:

Этот вариант не пропускает злаполучную -1

Посмотрите на класс twoPoint. Наверняка, "-1" некий код возвращения ошибки. Если так, то тупо пропускайте, если twoPoint.read<0. Правильнее, запрашивать новый пакет и вввести CRC на целостность передаваемого пакета (структуры).

qbit
Offline
Зарегистрирован: 18.03.2019

MsFedkin пишет:

uint8_t* pparsestract = (uint8_t*)&parsestract; // указатель для структуры
  for(size_t i = 0; i < sizeof(parse);i++){
    parseVal = twoPoint.read(); // читаем значение с блютуза и записываем в переменную
    delay(80); // кастыль
    (*pparsestract++) = parseVal;
  }

Кажется, вот в чем дело. Вы делаете попытку копирования всего массива, размером sizeof(parse) по наличию хотябы одного байта в принятом буфере, но Вы не знаете каков размер принятой информации в twoPoint и он наверняка меньше, чем Вы пытаетесь прочесть. Поэтому, twoPoint и выдает ошибку "-1". Надо ждать пока не будут полученны данные или же делать контроль по размеру принятых данных и только потом копировать и парсить.

Костыль не совсем "костыль". :)