Два xbee (маршрутизатор At), подключенные к Xbee (координатору)

Я работаю над проектом, который включает xbees. Моя установка — это просто один Xbee (режим координатора API), подключенный к Arduino в качестве главного устройства. Этот ведущий блок получает данные от нескольких Xbees (ведомых устройств), которые питаются только от батареи, и считывает данные с контакта 17 АЦП. Значения АЦП передаются на главный xbee для отображения на последовательном терминале. Подчиненные устройства Xbee настроены как (режим Router AT). Я делал это только между двумя xbees: 1 ведущим и 1 ведомым. У меня есть код, который считывает MAC-адрес отправителя Xbee, а затем отображает переданное значение ADC. Все это было в порядке, пока я не добавил еще одно подчиненное устройство, мне действительно нужна помощь, так как я не могу связать каждый MAC-адрес с правильным значением ADC. Ни один из моих кодов не может читать оба варианта попеременно; в какой-то момент он перестает читать с единицы. Если есть советы, как распознать данные, поступающие от нескольких xbees в одной сети, буду признателен. Вот мой код:

#include <XBee.h>
#include <SoftwareSerial.h>

SoftwareSerial myserial(5,6);

float distance;

uint8_t myaddress[10];

XBee xbee = XBee();

uint8_t shCmd[] = {'S','H'};
uint8_t slCmd[] = {'S','L'};
AtCommandRequest atRequestSH = AtCommandRequest(shCmd);
AtCommandRequest atRequestSL = AtCommandRequest(slCmd);
AtCommandResponse atResponse = AtCommandResponse();

void getMyAddress(){
  xbee.send(atRequestSL);

  if(xbee.readPacket(5000)){
      xbee.getResponse().getAtCommandResponse(atResponse);
      if (atResponse.isOk()){
        for(int i = 0; i < atResponse.getValueLength(); i++){
          myaddress[i] = atResponse.getValue()[i];
        }
      }
  }
  delay(100);
}

void setup(){
Serial.begin(1200);
myserial.begin(1200);
xbee.begin(myserial);
}

void loop() {
  getMyAddress();
  for(int i=0; i < 10; i++) {
      Serial.print(myaddress[i], HEX);
      Serial.print(" ");
  }

Serial.print("\n");

if (myserial.available() >= 21) { //
if (myserial.read() == 0x7E) { 
  for (int i = 1; i<19; i++) { // Skip ahead to the analog data

    byte discardByte = myserial.read();
}
  int analogMSB = myserial.read(); // Read the first analog byte data
  int analogLSB = myserial.read(); // Read the second byte
  int analogReading = analogLSB + (analogMSB * 256);
  distance = ((analogReading *1.0) / 1023.0)* 3.3;
  Serial.println(distance);

}
 } 
}  

person Aboorah Abeer    schedule 07.04.2015    source источник


Ответы (1)


В коде, где вы пропускаете данные, чтобы перейти к аналоговому значению, вы найдете MAC-адрес устройства, отправляющего данные.

if (myserial.read() == 0x7E) { 
  for (int i = 1; i<19; i++) { // Skip ahead to the analog data

    byte discardByte = myserial.read();
}

Вы должны внимательно изучить эти данные перед их обработкой — убедитесь, что это образец ввода-вывода, просмотрев тип кадра, проверив длину кадра, проверив контрольную сумму в конце кадра и т. д. Библиотека, которую вы 're use, по-видимому, имеет функции для обработки AT-команд и ответов, возможно, он также имеет функции для типа кадра I/O Sample.

На этой странице поддержки Digi объясняется выборка ввода-вывода и документируются различные поля в кадр полученной выборки данных ввода-вывода (тип 0x92).

person tomlogic    schedule 08.04.2015
comment
Пытаясь в течение недели следовать вашему совету, мне удалось заставить его работать. Большое спасибо :) - person Aboorah Abeer; 14.04.2015
comment
Затем вы можете опубликовать ответ на свой вопрос, показав сработавший код, чтобы кто-то, кто будет искать в будущем, мог увидеть, как вы решили проблему. - person tomlogic; 15.04.2015
comment
@AboorahAbeer Я знаю, что это было давно, но если бы вы опубликовали ответ на свой вопрос, это было бы очень полезно для меня и очень признательно. - person Mike C.; 12.10.2017