Неполное сообщение при приеме сообщения по Bluetooth

cottonhead
Offline
Зарегистрирован: 10.04.2018

Гайз, нужна помощь, вы последняя надежда. Есть проблема с передачей данных по bluetooth. Ситуация такая: есть две ардуинки с hc-05 на борту каждой, один мастер, другой слэйв, соответственно, сопряжение есть, все ок. Тему я некорректно назвал немного, не знаю, как иначе. Суть в том, что я передаю какую-то переменную, не суть, пусть обычный инкремент. На ведомой ардуинке вывожу в сериал порт эту переменную, все отлично работает. На этой же ведомой ардуинке есть еще одна какая-то переменная, ее вывожу в сериал порт и тоже все отлично отображается. Но когда я пытаюсь объеденить две этих переменных и показать в терминале, то происходит такая вещь: значение первой переменной с мастер ардуинки обрывается после первого символа, переносится на другие строки, да и вообще полная сотона твориться, вторая же переменная отображается корректно. Вывожу в таком формате: 

Serial.print(master); 
Serial.print(slave);
Serial.print("\n"); 
 

На самом деле перепробовал десятки вариантов, объединял в одну строку на более ранних этапах, баловался с задержками, baud rate и так далее. Кстати, baud rate менял, ставил 38400, ставил 9600, проблема остается. В AT командах стоит та же скорость, что и в скетче, если что, проблема не в этом.  
Я думаю, что проблема возникает из-за того, что ардуинки не синхронизированы между собой. Первая ардуинка не дожидается второй, че успела получить, то на вывод и отправляет. Хотя опять же странно, когда одну переменную вывожу, то разрывов этих не случается. Пробовал делать проверку по длине сообщения по типу if(master.lenght()>=3), но это ни к чему не привело. 
Очевидное решение для меня - это организация некой проверки на то, что пакет прибыл в целости и сохранности, а только потом производить дальнейшие действия. Вот здесь я обращаюсь к вам, ребят. Не знаю, как такую проверку сделать, куда можно почитать зайти? Или может проблема в чем-то еще? Уже неделю тыкаюсь, а результат все равно один и тот же. 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетчи приёмника и передатчика, как можно более короткие, только чтобы продемострировать проблему, приведите.

Иначе Ваше сообщене выгядит как "у меня ХЗ какая программа и она ХЗ как работает, ХЗ что делать".

cottonhead
Offline
Зарегистрирован: 10.04.2018

Скетч мастер ардуинки

#include <VirtualWire.h> 
 
int FarcopAngle = 0;  //угол прицепа, град 
void setup() {   

  Serial.begin(9600);
    
}
 
void loop() {   
  String str;   
     
  FarcopAngle = -127.918+0.256*(float)analogRead(A3);  //определение угла прицепа   
    
  str = String(FarcopAngle);  //преобразование данных в строковый тип 
  
  Serial.println(str); 
  delay(100);
  } 

 

Фрагмент скетча слэйв ардуинки

void setup()
{

  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  Serial.begin(9600);
  mySerial.begin(9600);
   
}
......
......
void loop()
{  
....
......
  if (mySerial.available()>0) {
    char c = mySerial.read();
 
    String str;
   
    int fi_floor = floor(Angle_2);
    String fi = String(fi_floor);
    String teta = String(c);
    String znak = "|";
    String fullDegree;
    
   fullDegree = teta+znak+fi;
  
   Serial.print(fullDegree);  //Вывод в COM - port значения углов
    
   
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, Вы не поняли. Вы уж выделите фрагмент в законченном виде. чтобы я мог его просто запустить у себя, и увидеть Вашу проблему.

Хотя, уже в этом куске что-то странное написано. Вы не скапливаете всю строку в риёмнике, а получив первый же символ, кидаетесь что-то делать. А кто будет строку целиком получать?

cottonhead
Offline
Зарегистрирован: 10.04.2018

А датчики вы тоже сейчас паять будете, чтобы проверить? Просто это не даст вам никакого профита, если я скину полный код. Значения переменных это данные с гироскопа и потенциометра

cottonhead
Offline
Зарегистрирован: 10.04.2018

Объясните, пожалуйста, как получить полную строку? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ПОлучать посимвольно и накапливать в строке пока не будет получен признак конца строки, например.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cottonhead пишет:

А датчики вы тоже сейчас паять будете, чтобы проверить? Просто это не даст вам никакого профита, если я скину полный код. Значения переменных это данные с гироскопа и потенциометра

Не буду. Вы сделайте скетч со случайными (или даже фиксированными) значениями переменных, снятых датчиков, главное, чтобы была видна проблема.

А профита мне никакого и не надо - он Вам нужен. А так ... ну, вот смотрю я на Ваш код. Что за переменные, каких они типов ... хрен его знает.

cottonhead
Offline
Зарегистрирован: 10.04.2018

мяу

cottonhead
Offline
Зарегистрирован: 10.04.2018

ЕвгенийП пишет:

ПОлучать посимвольно и накапливать в строке пока не будет получен признак конца строки, например.

Честно не сталкивался еще с таким, как вы видите. Буду благодарен, если подскажете, как такое сделать или буду рад ссылочке на форум или статейку. Могу и сам пойти бороздить интернет и тыкать, но это время

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ни хрена не поняли. Я ж Вам писал ", как можно более короткие, только чтобы продемострировать проблему". Ну сделайте короткий код на пять строк - лишь бы проблема видна была. Мне что и впрямь датчикии паять?

cottonhead
Offline
Зарегистрирован: 10.04.2018

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Коротки, работающий скетч, который можно запустить и увидеть проблему. Теперь поняли?

cottonhead
Offline
Зарегистрирован: 10.04.2018

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