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);
}