Не могу разобраться с XBee

dedefisheo
Offline
Зарегистрирован: 16.03.2012

Доброго времени суток!

Есть 2 XBee'шки 1S, 2 Uno, UartSBee, IO и ХВее шилды.. В виду своего незнания данной технологии, пытался разобраться по видео Ждереми Блюма.. Прошить ХВее удалось далеко не с первого раза и в итоге программой X-CTU. Помогите, пожалуйста, разобраться, в чем может быть проблема теперь:

На оду Уну цепляю ИОшилд, аналоговый датчик и ХВее.. Значения датчика хочу передавать на другую Уну для просмотра их на компе и дальнейшей обработки. ДАнные датчика колеблются от 0 до 1000, примерно, выше не замечал.. Отправка данных осуществляется вполне нормально, данные передаются четко, датчик не врет. Но вот проблема, принимать второй ХВее никак не хочет, сперва выдает результаты типа, 55 49 53 13 10 и дальше все по кругу, через мин 5 появляется единственное значение - 55. Реакции на датчик нет, т.е. если я его отключаю - то все те же цифры.. Но если выключаю отправителя - то и приемник перестает выдавать хоть какие-то цифры. Проверял отправителя всеми способами, в том числе и в X-CTU, да и простым подключением XBee в UaerSBee - данные верные, только вставляю в Уну с шилдом - все по-новой. Пробовал перепрошивать, менял шилды, смотрел в сторону типов данных(на них, почему-то и есть подозрение, но уже не хватит сил осознать). Помогите, плиз, разобраться!

Отправитель:

 


int MPin = 0;

void setup()

{
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(MPin);
  Serial.println(val);
  delay(1000);
  
}

Получатель:

void setup()
{

 Serial.begin(9600);

}

void loop()
{  

 while( Serial.available() == 0);
  int data = Serial.read();  
 delay(1);  


  Serial.println(data);
  Serial.flush();  
  delay(1000);
  
}

 

 

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Для того что бы быть уверенным, что у вас правильно организованна передача данных сначала проверьте без модулей, соеденив RX с TX, TX с RX и GND с GND дуин.

dedefisheo
Offline
Зарегистрирован: 16.03.2012

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

При таком соединении - приемник показывает все те же 55 и.т.д, но никак не то, что нужно.

maksim
Offline
Зарегистрирован: 12.02.2012

Вы должны понимать, что функия Serial.print(val); преобразует ваше значение в коды АСКИ и отправляет по байтам (по символам). То есть например значение 1234 преобразуется в 49, 50, 51, 52 и отправляется этими 4 байтами. На стороне приемника, так как функция Serial.read() просто читает принимаемые байты вам нужно собрать значение из кодов АСКИ.
Вот примеры:

Приемник:

int data = 0;
boolean result = 0;
void setup()
{
  Serial.begin(9600);
}

void loop()
{  
  while(Serial.available()){ // Если у буфере что есть, то цикл
    delay(2);
    data *= 10;
    data += Serial.read() - '0'; 
    result = 1;
  }

  if(result){ // Если есть результат, то
    Serial.println(data);
    Serial.flush();
    data = 0;
    result = 0;
  }
}

Передатчик: (отличается от вашего только функцией Serial.print(val);)

int MPin = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(MPin);
  Serial.print(val);
  delay(1000);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

 И кстати, код 55, который вы видите в мониторе это цифра 7.

maksim
Offline
Зарегистрирован: 12.02.2012

И еще есть второй способ, разбить значение на 2 байта, отправить, принять и собрать обратно.

Приемник:

int data = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{  
  
  if(Serial.available()){ // Если в буфере что есть, то
    delay(2);
    byte HighByte = Serial.read();
    delay(2);
    byte LowByte = Serial.read();
    data = HighByte;
    data = (data << 8) | LowByte;
    Serial.println(data);
    Serial.flush();
    data = 0;
  }
}

или можно так

int data = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{  
  
  if(Serial.available()){ // Если в буфере что есть, то
    delay(2);
    data = (byte)Serial.read();
    delay(2);
    data = (data << 8) | (byte)Serial.read();
    
    Serial.println(data);
    Serial.flush();
    data = 0;
  }
}

Передатчик:

int MPin = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(MPin);
  byte HighByte = (byte)((val >> 8) & 0xFF);
  byte LowByte = (byte)(val & 0xFF);
  Serial.write(HighByte);
  Serial.write(LowByte);
  delay(1000);
}

или так:

int MPin = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(MPin);
  Serial.write((byte)((val >> 8) & 0xFF));
  Serial.write((byte)(val & 0xFF));
  delay(1000);
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

 А хВее (в АТ режиме) я настраивал так чтобы модули адресовали пакеты друг другу, а не отправляли их в широковещательном режиме.

void setup(){
  Serial.begin(9600);
  Serial.print("+++");
  while(!Serial.available());
  Serial.println("ATDH 0013A200"); // старшие 32 бита серийного номера модуля которому будем передавать\принимать данные
  Serial.println("ATDL 40315542"); // младшие 32 бита серийного номера модуля которому будем передавать\принимать данные
  delay(10);
  Serial.println("ATCN");
  delay(10);
  Serial.flush();
  delay(100);
}

 

dedefisheo
Offline
Зарегистрирован: 16.03.2012

Максим, огромное спасибо! Я догадывался, что у меня проблема с типом данных, точнее, их "сборе".. но после целого дня проб и попыток - уже не мог сообразить, потому обратился сюда! Спасибо, разобрался, настроил, все получилось.. благодаря Вам!