xBee communication problem

Hello everyone, my first post here :slight_smile:

I'm triying to do a little project but first I'm doing some test with xBee, but I have not any idea of what is grong with the code.

First of all set one xBee as Coordinator:

ID pan: C
DH: 0
DL: 1
AP: API Enable 2
CE: Coordinator

The second one as router:

ID pan: C
DH: 0
DL: 0
CE: end device

Here is the code for Coordinator:

#include <XBee.h>

XBee xbee = XBee();


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

void loop(){
  uint8_t data[] = {'H','I'};
  XBeeAddress64 addr64 = XBeeAddress64();
  addr64.setMsb(0x0013a200);
  addr64.setLsb(0x41255DB2);
  ZBTxRequest zbTx = ZBTxRequest(addr64, data, sizeof(data));
  xbee.send(zbTx);
    
  delay(3000); // 
  }

Code for router

#include <XBee.h>

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();

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

void loop(){
  String sample;
  xbee.readPacket();
  if (xbee.getResponse().isAvailable()){
    Serial.println(xbee.getResponse().getApiId());
    if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE){
      xbee.getResponse().getZBRxResponse(rx);
      for (int i=0; i< rx.getDataLength();i++){
        sample +=(char)rx.getData(i);
        }
        Serial.println(sample);
      }
    }else if (xbee.getResponse().isError()){
      Serial.println("Error reading packet. Error code: ");
      Serial.println(xbee.getResponse().getErrorCode());
      }
  delay(3000); // 
  }

After this I upload the code and switch the shield mode USB to xBee and open the Serial Monitor of the
router. There is nothing on the screen, not even error message.

I hope you can help, thanks in advance.

0,0 and 0,1 are lousy addresses. Use something else.

0,0 means broadcast to the world, which is NOT what you want to do.

  addr64.setMsb(0x0013a200);
  addr64.setLsb(0x41255DB2);

Why are you telling the coordinator to talk to this address, when you say that that is not the address of the end device?

So I guess that I'll have to put these address on XCTU addr64.setMsb(0x0013a200);
addr64.setLsb(0x41255DB2); instead the 0,0. I read these two address from the receiver module and I put on the code because I was thinking it was correct.

If anyone has some example of 2 or more devices on API mode and can share with me I'll be grateful.

well im not really expert but if u want my example project 5 module xbee s2c comunnication.
my config xbee
pan id 123
//coordinator SH 13A200 SL 41630C48 DH 0 DL FFFF api mode 2
//end dev SH 13A200 SL 41554A03 DH 13A200 DL 41630C4B api mode 2
//router 1 SH 13A200 SL 41554A05 DH 0 DL 0 api mode 2
//router 2 SH 13A200 SL 41673405 DH 0 DL 0 api mode 2
//router 3 SH 13A200 SL 41630C4B DH 0 DL 0 api mode 2
end device

#include <XBee.h>
XBee xbee = XBee();
uint8_t data[] = {'H','I'};
// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x0013A200, 0x41630C4B);
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(data));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
int statusLed = 13;
int errorLed = 13;
void setup() {
   Serial.begin(9600); //Baud rate: 9600
   pinMode(statusLed, OUTPUT);  
   pinMode(errorLed, OUTPUT);  
   xbee.setSerial(Serial);
}
 
void loop {
    xbee.send(zbTx);
    // after sending a tx request, we expect a status response
    flashLed(statusLed, 1, 100);
    if (xbee.readPacket(500))// wait 500ms if true
   { 
       if (xbee.getResponse().isAvailable()) {
          // got a response! // trx packet from xbee to variable         
           if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
              xbee.getResponse().getZBTxStatusResponse(txStatus);
              if (txStatus.getDeliveryStatus() ==   SUCCESS) {
                      // success.  time to celebrate
                      flashLed(statusLed, 5, 100);
                      //zbTx.setFrameId(xbee.getNextFrameId());
              }   
              else {
                       // the remote XBee did not receive our packet. is it powered on?
                       flashLed(errorLed, 3, 50);
              }
         }
         else if (xbee.getResponse().isError()) {
              //Serial.print("Error reading packet.  Error code: ");  
              //Serial.println(xbee.getResponse().getErrorCode());
              flashLed(errorLed, 6, 100);
         }
         } else {
                flashLed(statusLed, 2, 100);
                //no response
         }
    }//
    else
    {
           //time out after 500ms for read packet
    }
}
void flashLed(int pin, int jumlah, int wait) { 
   for (int i = 0; i < jumlah; i++) {
       digitalWrite(pin, HIGH);
       delay(wait);
       digitalWrite(pin, LOW);   
       if (i + 1 < jumlah) {
          delay(wait);
       }
   }
}

router

#include <XBee.h>
#include <AltSoftSerial.h>
AltSoftSerial xb;
uint8_t payload[] = {0,0} //iniate array byte for receive because 2 char  H,I
ZBRxResponse zbRx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();
// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x00000000, 0x41673405);// just change to other address you want forward
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
void setup()
{
   Serial.begin(9600);
   xbee.setSerial(xb);
   xb.begin(9600);
   xb.println("ready");
}
void loop()
{
   // 1. This will read any data that is available:
   xbee.readPacket();
   // 2. Now, to check if a packet was received:
   if (xbee.getResponse().isAvailable())
   {
      // got packet from xbee
      if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
      {
          // trx packet from xbee to variable
          xb.print("Got an rx packet from: ");
          XBeeAddress64 senderLongAddress = zbRx.getRemoteAddress64();
          print32Bits(senderLongAddress.getMsb());
          xb.print(" ");
          print32Bits(senderLongAddress.getLsb());
          xb.println();
          xbee.getResponse().getZBRxResponse(zbRx);
          if (zbRx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
              // the sender got an ACK
              flashLed(statusLed, 5, 100);
              xb.println("packet acknowledged");
          } 
          else {
              // we got it (obviously) but sender didn't get an ACK
              flashLed(errorLed, 2, 100);
              xb.println("packet not acknowledged");
          }         
          xb.print("Packet length is ");
          xb.print(zbRx.getPacketLength(), DEC);
          xb.print(", data payload length is ");
          xb.print(zbRx.getDataLength(),DEC); 
          xb.print(" checksum is ");
          xb.println(zbRx.getChecksum(), HEX);   
          xb.println("Received Data: ");
          for (int i = 0; i < zbRx.getDataLength(); i++) {
          print8Bits(zbRx.getData()[i]);//
          payload[i]=zbRx.getData()[i];
          xb.print(' ');
          }
          xb.println();
          //getFrame for format api start delimiter 0x7E bla bla
          //dataOffset for payload packet
          //getdatalength for data payload length
          zbTx.setPayload(zbRx.getFrameData() + zbRx.getDataOffset(), zbRx.getDataLength());
          xbee.send(zbTx);
          xb.println("Forward packet");
      } else {
           xb.print("Not packet received, other status");    
      }     
   }
   else if (xbee.getResponse().isError()){
       Serial.print("error code:");
       Serial.print(xbee.getResponse().getErrorCode());
       if (xbee.getResponse().getErrorCode()==1){
          xb.println(" Checksum error");      
       } else 
       if (xbee.getResponse().getErrorCode()==3){
          xb.println(" Unexpected Start Byte"); 
       }
   }
   else {
       xb.println("packet loss");
   }
   delay(500);
}// END OF LOOP

coordinator

#include <XBee.h>
#include <AltSoftSerial.h>
AltSoftSerial xb;
uint8_t payload[] = {0,0} //iniate array byte for receive because 2 char  H,I
ZBRxResponse zbRx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();
void setup()
{
   Serial.begin(9600);
   xbee.setSerial(xb);
   xb.begin(9600);
   xb.println("ready");
}
void loop()
{
   // 1. This will read any data that is available:
   xbee.readPacket();
   // 2. Now, to check if a packet was received:
   if (xbee.getResponse().isAvailable())
   {
      // got packet from xbee
      if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
      {
          // trx packet from xbee to variable
          xb.print("Got an rx packet from: ");
          XBeeAddress64 senderLongAddress = zbRx.getRemoteAddress64();
          print32Bits(senderLongAddress.getMsb());
          xb.print(" ");
          print32Bits(senderLongAddress.getLsb());
          xb.println();
          xbee.getResponse().getZBRxResponse(zbRx);
          if (zbRx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
              // the sender got an ACK
              flashLed(statusLed, 5, 100);
              xb.println("packet acknowledged");
          } 
          else {
              // we got it (obviously) but sender didn't get an ACK
              flashLed(errorLed, 2, 100);
              xb.println("packet not acknowledged");
          }         
          xb.print("Packet length is ");
          xb.print(zbRx.getPacketLength(), DEC);
          xb.print(", data payload length is ");
          xb.print(zbRx.getDataLength(),DEC); 
          xb.print(" checksum is ");
          xb.println(zbRx.getChecksum(), HEX);   
          xb.println("Received Data: ");
          for (int i = 0; i < zbRx.getDataLength(); i++) {
          print8Bits(zbRx.getData()[i]);//
          payload[i]=zbRx.getData()[i];
          xb.print(' ');
          }
          xb.println();
          c[0]= zbRx.getData(0);
          c[1]= zbRx.getData(1);
          xb.print("Value ");
          xb.println(c);
      } else {
           xb.print("Not packet received, other status");    
      }     
   }
   else if (xbee.getResponse().isError()){
       Serial.print("error code:");
       Serial.print(xbee.getResponse().getErrorCode());
       if (xbee.getResponse().getErrorCode()==1){
          xb.println(" Checksum error");      
       } else 
       if (xbee.getResponse().getErrorCode()==3){
          xb.println(" Unexpected Start Byte"); 
       }
   }
   else {
       xb.println("packet loss");
   }
   delay(500);
}// END OF LOOP
void print32Bits(uint32_t dw){
  print16Bits(dw >> 16);
  print16Bits(dw & 0xFFFF);
}

void print16Bits(uint16_t w){
  print8Bits(w >> 8);
  print8Bits(w & 0x00FF);
}

void print8Bits(byte c){
  uint8_t nibble = (c >> 4);
  if (nibble <= 9)
    Serial.write(nibble + 0x30);
  else
    Serial.write(nibble + 0x37);
      
  nibble = (uint8_t) (c & 0x0F);
  if (nibble <= 9)
    Serial.write(nibble + 0x30);
  else
    Serial.write(nibble + 0x37);
}

Thanks andrerrp, apreciate it! I will try with your code and tell you how it goes for me and my project.

Thanks in advance :wink: