Serial Communication between XBee using Arduino

Priyanshu27:
Error Message:

no matching function for call to 'HardwareSerial::print(uint8_t&, uint8_t&, uint8_t&)'

You need to post the complete program so we can see how all the variables are defined.

The output I want in return should be like in this format:
XBeeId 1: 28,34

And same way I want to get at the receiver side.

I don't believe there is any need for the style XBeeId 1: 28,34. All that needs to be sent is 3 numbers in an array with no colons or commas or text. The receiving program will be written to expect that and everything will be much simpler.

...R

You need to post the complete program so we can see how all the variables are defined.

#include <XBee.h>
#include <stdlib.h>
#include <time.h>
XBee xbee = XBee();
XBee xbee1 = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
//XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0X4147FE2A);
//XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
//XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
//XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1); 
//uint8_t sample;
uint8_t count = 0;
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  Serial.println("Start Transmitting");
  srand((unsigned)time(NULL));
}

void loop() 
{
  uint8_t i = 0;
  uint8_t xy[3];
  //Serial.print("Data Sent: ");
  xy[0] = "XBeeId:";
  xy[1] = rand()%10;
  xy[2] = rand()%10;
  Serial.print(xy[0]);
  Serial.print(xy[1]);
  Serial.print(",");
  Serial.println(xy[2]);
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, xy, sizeof(xy));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, xy, sizeof(xy));
  //sample = "";
  while(i<1)
  {
    xbee.send(zbTx5);
    Serial.println("... To Router 5 ...");
    delay(1000);
    i++;
  }
  xbee.readPacket(500);
  Serial.println("Packet Detected");
  Serial.print("count: ");
  Serial.println(count);
  if(xbee.getResponse().isAvailable())
  {
    Serial.println("Packet Arrived");
    Serial.print("count: ");
    Serial.println(count);
    //Serial.println(xbee.getResponse().getApiId());
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      Serial.print("Data Received: ");
      for(int i=0; i<rx.getDataLength(); i++)
      {
        //sample+= (char)rx.getData(i);
        Serial.print(rx.getData(i),DEC);
      }
      //Serial.println(sample);
      count++;
      Serial.print("count: ");
      Serial.println(count);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
  }
  delay(1000); 
}

I don't believe there is any need for the style XBeeId 1: 28,34

Yeah, we don't need to style like this but by just sending three numbers there may be a possibility of reading wrong coordinates.

For example, suppose we sending data from Router 1 to Router 5 with a location of (2,34). So, the data received at Router 5 will be 1234. Here, we can say 1 stands for Router 1 but for the coordinates, we may read as (23,4) or (2,34). So we can read an incorrect location as well. How to get rid of that?

Assuming the code in Reply #20 is what gave rise to the error message in Reply #18, I can't figure out what the problem might be without knowing the line number reported along with the error message. Post the complete error message.

For example, suppose we sending data from Router 1 to Router 5 with a location of (2,34). So, the data received at Router 5 will be 1234.

There will be no ambiguity. On the receiving side there will also be an array with 3 elements. receivedData[0] will have the ID number; receivedData[1] will have the xValue and receivedData[2] will have the yValue. (Obviously you can choose your own array name)

...R

Post the complete error message.

This was the complete error message:

error: no matching function for call to 'HardwareSerial::print(uint8_t&, uint8_t&, uint8_t&)'
** Serial.print(xy[0],xy[1],xy[2]);**

xbee.readPacket(500);
  Serial.println("Packet Detected");
  Serial.print("count: ");
  Serial.println(count);
  if(xbee.getResponse().isAvailable())
  {
    Serial.println("Packet Arrived");
    Serial.print("count: ");
    Serial.println(count);
    //Serial.println(xbee.getResponse().getApiId());
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      Serial.print("Data Received: ");
      for(int i=0; i<rx.getDataLength(); i++)
      {
        //sample+= (char)rx.getData(i);
        Serial.print(rx.getData(i),DEC);
      }
      //Serial.println(sample);
      count++;
      Serial.print("count: ");
      Serial.println(count);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
  }
  delay(1000);

On the receiving side there will also be an array with 3 elements

As you see in the code, we are getting the received data by using (rx.getData(i), DEC). I guess, but not sure if it is getting data bit by bit or it taking data as a packet. So, can you suggest a way of getting a data packet in form of an array with three elements?

Priyanshu27:
This was the complete error message:

error: no matching function for call to 'HardwareSerial::print(uint8_t&, uint8_t&, uint8_t&)'
** Serial.print(xy[0],xy[1],xy[2]);**

Somehow I think there is more. Never mind the fancy orange colour - just copy and paste the error message from the Arduino IDE.

As you see in the code,

I can't see because you have not posted the complete program.

And I presume you have realized that if you change the way you send data you also have to change the way it is received so that the receiving code matches the sending code.

Post the latest versions of your sending and receiving programs. There is no value looking at only one of them. That's like one-handed clapping.

...R

just copy and paste the error message from the Arduino IDE.

That was the entire error I was getting. I've copied and pasted it as it is. Just highlighted it with a fancy orange color so that you can see it.

I can't see because you have not posted the complete program.

If you see Reply #20, I've posted my complete updated code. However, in Reply #22 I posted on receiver code again because I wanted to ask problem from that part of the code.

And I presume you have realized that if you change the way you send data you also have to change the way it is received so that the receiving code matches the sending code

If you see my entire code, as said by you to assign an ID no. to every router so that we can know from which router data is coming. But the issue I was facing on the receiver side is that we are getting data bit by bit and I'm not able to collect the data coming from the respective array into different arrays. If you can see the code and tell me how to create arrays at the receiving end and how to store the incoming data into it, it will be a huge huge help.

I'm attaching my complete code again just in case you face problem in going back and forth for different replies.

#include <XBee.h>
#include <stdlib.h>
#include <time.h>
XBee xbee = XBee();
XBee xbee1 = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
//XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0X4147FE2A);
//XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
//XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
//XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1); 
//uint8_t sample;
uint8_t count = 0;
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  Serial.println("Start Transmitting");
  srand((unsigned)time(NULL));
}

void loop() 
{
  uint8_t i = 0;
  uint8_t xy[3];
  //Serial.print("Data Sent: ");
  xy[0] = "XBeeId:";
  xy[1] = rand()%10;
  xy[2] = rand()%10;
  Serial.print(xy[0]);
  Serial.print(xy[1]);
  Serial.print(",");
  Serial.println(xy[2]);
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, xy, sizeof(xy));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, xy, sizeof(xy));
  //sample = "";
  while(i<1)
  {
    xbee.send(zbTx5);
    Serial.println("... To Router 5 ...");
    delay(1000);
    i++;
  }
  xbee.readPacket(500);
  Serial.println("Packet Detected");
  Serial.print("count: ");
  Serial.println(count);
  if(xbee.getResponse().isAvailable())
  {
    Serial.println("Packet Arrived");
    Serial.print("count: ");
    Serial.println(count);
    //Serial.println(xbee.getResponse().getApiId());
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      Serial.print("Data Received: ");
      for(int i=0; i<rx.getDataLength(); i++)
      {
        //sample+= (char)rx.getData(i);
        Serial.print(rx.getData(i),DEC);
      }
      //Serial.println(sample);
      count++;
      Serial.print("count: ");
      Serial.println(count);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
  }
  delay(1000); 
}

The data which we are taking at the receiver end is in this manner:

 if(xbee.getResponse().isAvailable())
  {
    Serial.println("Packet Arrived");
    Serial.print("count: ");
    Serial.println(count);
    //Serial.println(xbee.getResponse().getApiId());
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      Serial.print("Data Received: ");
     for(int i=0; i<rx.getDataLength(); i++)          //This the loop for taking the receiving values.
      {
        //sample+= (char)rx.getData(i);
        Serial.print(rx.getData(i),DEC);              //Here, we are printing the received value
      }
      //Serial.println(sample);
      count++;
      Serial.print("count: ");
      Serial.println(count);
    }
  }

Priyanshu27:
I'm attaching my complete code again just in case you face problem in going back and forth for different replies.

Thank you for that.

However you seem to have posted the complete transmitting program but only part of the receiving program. Please post two complete programs.

And I remain sceptical about the completeness of your error message. I deliberately caused an error in a simple program and this is the message I got

ArduinoTemp.ino: In function 'void loop()':
ArduinoTemp.ino:22:20: error: 'low' was not declared in this scope
Error compiling.

You can see that it has identified the name of the program, the function where the error was and the line and character number where it was detected.

...R

However you seem to have posted the complete transmitting program but only part of the receiving program. Please post two complete programs.

There are no two codes as I'm using this code as the complete code. However, you may be finding the receiver code incomplete because I might have written an incomplete code for receiving the data. As my coding is not strong, I'm seeking help from the forum if I can get the completeness in my code.

And I remain skeptical about the completeness of your error message

#include <XBee.h>
#include <stdlib.h>
#include <time.h>
XBee xbee = XBee();
XBee xbee1 = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
//XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0X4147FE2A);
//XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
//XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
//XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1); 
String sample;
uint8_t count = 0;
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  Serial.println("Start Transmitting");
  srand((unsigned)time(NULL));
}

void loop() 
{
  uint8_t i = 0;
  uint8_t x = rand()%10;
  uint8_t y = rand()%10;
  uint8_t c = "XBeeId 1:";
  uint8_t data[] = {x,y};
  Serial.print(c,data[0],data[1]);
  //uint8_t data[] = "HI, I'M Router 5!";
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, data, sizeof(data));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, data, sizeof(data));
  sample = "";
  while(i<1)
  {
    xbee.send(zbTx6);
    Serial.println("To Router 6");
    delay(1000);
    i++;
  }
  //String myString = "By Priyanshu";
  //data = atoi(myString.c_str());
  //char buf[myString.length()+1];
  //myString.toCharArray(buf, myString.length()+1);
  //data = ((uint8_t*)buf, strlen(buf));
  xbee.readPacket(500);
  Serial.println("Packet Detected");
  Serial.print("count: ");
  Serial.println(count);
  if(xbee.getResponse().isAvailable())
  {
    Serial.println("Packet Arrived");
    Serial.print("count: ");
    Serial.println(count);
    //Serial.println(xbee.getResponse().getApiId());
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      Serial.print("From Router 6: ");
      xbee.getResponse().getZBRxResponse(rx);
      for(int i=0; i<rx.getDataLength(); i++)
      {
        //sample+= (char)rx.getData(i);
        Serial.println(rx.getData(i),DEC);
      }
      count++;
      Serial.print("count: ");
      Serial.println(count);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
  }
  delay(1000); 
}

Try this code as I run on my machine and I'm getting this error. However, my objective from this error message is that at the transmitting end I'm able to send an ID no. but cannot differentiate that the coordinates I'm sending, how to figure it out.

As the random values, I'm generating as of now is between 0 to 9 just for the understanding purpose. But, in future, I shall be sending between 0 to 255 as there are in total 256 pixels of any color. So at that time how do we segregate the coordinates. Like the example, I gave earlier we are sending ID no. (say) 5 so we know it's ASCII value is 53 and the coordinates are (12,206). The output I'm getting is 5312206. So, how do we know if it is (12,206) or (122,06)? That's the problem I'm facing.

I know I've made it a big hype out of it, but as I mentioned my coding is not strong and this is an entirely new project for me so I'm facing a lot of challenges with it. You people being expert and thoroughly active on the forum to help the rookie coders might help me with it.

Priyanshu27:
There are no two codes as I'm using this code as the complete code.

You will make life a great deal easier for yourself if you create two separate programs - one for transmit and one for receive. At least do that until you are know how to get the communication working. Just make the simplest programs possible that will send and receive the data in the format you require.

It will also make it a great deal easier to help you.

When you have it working then you can combine the code into a single program if you wish.

...R

Hi Robin, I've resolved all the previous problems and now the data was transmitting the way I wanted. There was a change in the requirement of the project as earlier I was sending a broadcasted message, now I need to send as a unicast message. Means that now we have to take value from the user to send the message to the desired router. This thing should be done autonomously which I shall be seeing when an actual sensor is attached instead of generating a random number.

I used a help from your topic on "Serial Input Basics - updated" which helped me in taking input from the serial monitor and I must say it was a great help.

Now, the problem I'm facing is that at the time of taking input in the XBee mode of the Sainsmart Arduino-XBee Shield which is used to communicate between XBee and Arduino. Whatever, input I'm taking is not getting displayed on the serial monitor. So, my question is, do we have to apply a similar code at the receiving end just like we did at the transmitting end or that code works fine and I'm doing mistake at somewhere else.

I'm attaching my code for your reference.

#include <XBee.h>
#include <time.h>
#include <stdlib.h>
XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0x4147FE2A);
XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1);
uint8_t count = 0;
uint8_t input = 0;
String sample = "";
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  srand((unsigned)time(NULL));
}

void loop() 
{
  delay(1000);
  transmitXBee();
  delay(1000);
  receiveXBee();
  delay(1000);
}

void transmitXBee()
{
  uint8_t i = 0;
  uint8_t data[3];
  uint8_t receivedChar = '0';
  boolean newData = false;
  data[0] = '6';
  data[1] = rand()%256;
  data[2] = ',';
  data[3] = rand()%256;
  ZBTxRequest zbTx1 = ZBTxRequest(ROUTER1, data, sizeof(data));
  ZBTxRequest zbTx2 = ZBTxRequest(ROUTER2, data, sizeof(data));
  ZBTxRequest zbTx3 = ZBTxRequest(ROUTER3, data, sizeof(data));
  ZBTxRequest zbTx4 = ZBTxRequest(ROUTER4, data, sizeof(data));
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, data, sizeof(data));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, data, sizeof(data));
  
  delay(500);
  Serial.println("Start Transmitting");
  Serial.print("Data Sent:\t");
  Serial.print(data[0]);
  Serial.print(data[1]);
  Serial.print(data[2]);
  Serial.println(data[3]); 
  delay(500);
  if (Serial.available() > 0) 
  {
    receivedChar = Serial.read();
    newData = true;
  }
  if (newData == true) 
  {
    Serial.print("Input: ");
    Serial.println(receivedChar);
    newData = false;
    switch(receivedChar)
    {
      case '1':
        Serial.println("To Router 1");
        xbee.send(zbTx1);
        Serial.println();
        delay(500);
        break;
      case '2': 
        Serial.println("To Router 2");
        xbee.send(zbTx2);
        Serial.println();
        delay(500);
        break;
      case '3': 
        Serial.println("To Router 3");
        xbee.send(zbTx3);
        Serial.println();
        delay(500);
        break;
      case '4': 
        Serial.println("To Router 4");
        xbee.send(zbTx4);
        Serial.println();
        delay(500);
        break;
      case '5':
        Serial.println("To Router 5");
        xbee.send(zbTx5);
        Serial.println();
        delay(500);
        break;
      default: 
        Serial.println("Wrong input entered");
        break;
    }
  }
}

void receiveXBee()
{
  xbee.readPacket(500);
  Serial.println("Reading for Packet");
  if(xbee.getResponse().isAvailable())
  {
    Serial.print("Packet Available: ");
    Serial.println(count);
    delay(500);
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      delay(300);
      
      for(int i=0; i<rx.getDataLength(); i++)
      {
        sample += (char)rx.getData(i);
        //Serial.print(rx.getData(i),DEC);
      }
      Serial.print("count: ");
      count++;
      Serial.println(count);
      Serial.print("Packet Received: ");
      Serial.println(sample);
      delay(1500);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
    delay(500);
  } 
}

Priyanshu27:
So, my question is, do we have to apply a similar code at the receiving end just like we did at the transmitting end or that code works fine and I'm doing mistake at somewhere else.

I'm attaching my code for your reference.

I have several times asked you to post BOTH the sending and the receiving code. Without seeing both how can I answer your question.

...R

If you see the code in Reply #28, in the loop there are two functions called, one for the transmitXBee and other is for receiveXBee. I'm using only and only this code for exchanging messages as the Arduino UNO has to be mounted on the top of the LEGO Robot and I've to merge my code for taking values from the sensor as well as have to transmit and receive the data to other XBee.

However, as asked by you to make two programs till the time it is sure if both the codes are working fine and merge them after that. I'm attaching my transmitter and receiver code separately.

Transmitter Code:

#include <XBee.h>
#include <time.h>
#include <stdlib.h>
XBee xbee = XBee();
XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0x4147FE2A);
XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1);
uint8_t input = 0;
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  srand((unsigned)time(NULL));
}

void loop() 
{
  uint8_t data[3];
  uint8_t receivedChar = '0';
  boolean newData = false;
  data[0] = '6';
  data[1] = rand()%256;
  data[2] = ',';
  data[3] = rand()%256;
  ZBTxRequest zbTx1 = ZBTxRequest(ROUTER1, data, sizeof(data));
  ZBTxRequest zbTx2 = ZBTxRequest(ROUTER2, data, sizeof(data));
  ZBTxRequest zbTx3 = ZBTxRequest(ROUTER3, data, sizeof(data));
  ZBTxRequest zbTx4 = ZBTxRequest(ROUTER4, data, sizeof(data));
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, data, sizeof(data));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, data, sizeof(data));
  
  delay(500);
  Serial.println("Start Transmitting");
  Serial.print("Data Sent:\t");
  Serial.print(data[0]);
  Serial.print(data[1]);
  Serial.print(data[2]);
  Serial.println(data[3]); 
  delay(500);
  if (Serial.available() > 0) 
  {
    receivedChar = Serial.read();
    newData = true;
  }
  if (newData == true) 
  {
    Serial.print("Input: ");
    Serial.println(receivedChar);
    newData = false;
    switch(receivedChar)
    {
      case '1':
        Serial.println("To Router 1");
        xbee.send(zbTx1);
        Serial.println();
        delay(500);
        break;
      case '2': 
        Serial.println("To Router 2");
        xbee.send(zbTx2);
        Serial.println();
        delay(500);
        break;
      case '3': 
        Serial.println("To Router 3");
        xbee.send(zbTx3);
        Serial.println();
        delay(500);
        break;
      case '4': 
        Serial.println("To Router 4");
        xbee.send(zbTx4);
        Serial.println();
        delay(500);
        break;
      case '5':
        Serial.println("To Router 5");
        xbee.send(zbTx5);
        Serial.println();
        delay(500);
        break;
      default: 
        Serial.println("Wrong input entered");
        break;
    }
  } 
}

Receiver Code:

#include <XBee.h>
XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
uint8_t count = 0;
String sample = "";
void setup() 
{
  Serial.begin(9600);
  xbee.begin(Serial);
}
void loop()
{
  xbee.readPacket(500);
  Serial.println("Reading for Packet");
  if(xbee.getResponse().isAvailable())
  {
    Serial.print("Packet Available: ");
    Serial.println(count);
    delay(500);
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      delay(300);
      
      for(int i=0; i<rx.getDataLength(); i++)
      {
        sample += (char)rx.getData(i);
        //Serial.print(rx.getData(i),DEC);
      }
      Serial.print("count: ");
      count++;
      Serial.println(count);
      Serial.print("Packet Received: ");
      Serial.println(sample);
      delay(1500);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
    delay(500);
  }
}

Hope this will help your query which I might missed.

Thanks, that's a big help. However you have not told us exactly what happens when you try that pair of programs.

Also, if this was my problem I would take everything out of the Tx program except the minimum needed to send a message to a single Rx. Simplify, Simplify, Simplify.

And you seem to be sending the contents of the array data[] but I don't see any corresponding array in the Rx program.

I have been having another look at the XBee library documentation and examples. IMHO it is all a bit of dog's breakfast.

It looks like you can send an array[] easily but there is no easy way to receive it - so I can't even be sure that it will be sent :slight_smile:

Assuming your array data[]is sent correctly then what is received in the payload are the bytes that make up the array. This is a wild guess, but it may work.

... I'll need a little time to figure this out - will reply again asap

...R

However you have not told us exactly what happens when you try that pair of programs

I mentioned my question in Reply #28 but, I'll state again for your easiness. I'm using a Sainsmart XBee-Arduino Shield which is used to make communication between XBee and Arduino. So there are two jumpers on that shield stating USB/XBEE. So when you have to upload an Arduino Code place the jumpers in USB Mode and when you want to make communication wirelessly, switch them to XBEE Mode.

So, when the jumpers are in USB Mode, the transmitted code is working fine and I'm able to take input from the user. But, when I'm switching the jumpers to XBEE Mode, neither it accepting any serial input nor it is displaying anything at the receiver end (which I understand since it didn't take any input at transmitter end so how it will show anything at the receiver end). So, do I have to apply some similar code I applied at the transmitter end on the receiver side as well or I'm missing any function or library because of which communication will be possible (I have no idea if I would be missing as I'm having zero experience with XBee)?

Assuming your array data[]is sent correctly then what is received in the payload are the bytes that make up the array. This is a wild guess, but it may work.

Yeah, kind of you are correct. As on the transmitter end if I'm sending from the router (say) 6, and the coordinates are (123,230). So the data which is sent is visible as 5412344230, which means, 54 is the ASCII value of symbol '6', 123 and 230 are the coordinates of the random location and 44 is the ASCII value of ','. So we can understand the coordinates with the help of seeing the ASCII value as 44. So we are sending a data array but at the receiver, we are taking it bitwise and because of lack of knowledge, I'm not able to figure out how to receive the data as sent.

... I'll need a little time to figure this out - will reply again asap

Sure, you can have your time and meanwhile, I also search for some option by searching through some pages and groups available online. I'll update immediately if I get anything.

The following contains a simple technique that I have used previously but had forgotten the details. And I have been meaning for some time to refresh my knowldege.

At the top of your RX program add these two definitions

int receivedData[3];
byte* dataPointer;

and then replace this piece of code

      for(int i=0; i<rx.getDataLength(); i++)
      {
        sample += (char)rx.getData(i);
        //Serial.print(rx.getData(i),DEC);
      }
      Serial.print("count: ");
      count++;
      Serial.println(count);
      Serial.print("Packet Received: ");
      Serial.println(sample);

with the following

    dataPointer = reinterpret_cast<byte *>(receivedData);
    for(int n =0; n < rx.getDataLength(); n++)
    {
        *dataPointer = rx.getData(n);
        dataPointer += 1;
    }
    for (byte n = 0; n < 3; n++) {
        Serial.println(receivedData[n]);
    }

This may look complicated (thanks to C++'s cryptic language) but what it does is actually very simple. It figures out the memory address of the start of the array (in the variable dataPointer) and then writes each successive received byte into the memory addresses of the array. Hopefully that will replicate exactly the array that was sent.

...R

Hi Robin, I appreciate you gave me a solution for the receiver mode to store the data transmitted in an array. But for checking that there was some problem at the transmitting end as well which I'm not able to figure out.

'm using a Sainsmart XBee-Arduino Shield which is used to make communication between XBee and Arduino. So there are two jumpers on that shield stating USB/XBEE. So when you have to upload an Arduino Code place the jumpers in USB Mode and when you want to make communication wirelessly, switch them to XBEE Mode.

So, when the jumpers are in USB Mode, the transmitted code is working fine and I'm able to take input from the user. But, when I'm switching the jumpers to XBEE Mode, neither it accepting any serial input nor it is displaying anything at the receiver end (which I understand since it didn't take any input at transmitter end so how it will show anything at the receiver end)

I explained the whole procedure of how to send a message wirelessly through an XBee it in my previous Reply #32. So, when I type anything in USB Mode it is taking the input entered by me, however, when I type in XBee Mode when the XBee has to transmit wirelessly it is not taking any input.

I tried searching in the documentation of the XBee provided by DIGI "Datasheet for XBee 900HP DigiMesh Kit" and few other places on the internet like StackExchange, and the Arduino Forum itself, but couldn't find any relevant information on that. There may be a possibility that I have missed something while searching, however, almost every place it states that I need to configure my XBee through XCTU to make communication possible which I already did.

Can you look something for me, it will be a great help. So far, you helped me a lot because of which I can see some progress in my project.

Priyanshu27:
Hi Robin, I appreciate you gave me a solution for the receiver mode to store the data transmitted in an array. But for checking that there was some problem at the transmitting end as well which I'm not able to figure out.

I am not an XBee expert but I will try to help. Please post the latest version of your Tx and Rx programs that take account of my earlier advice. And tell us in detail what happens when you run them (or post error messages if they won't compile).

...R

Please post the latest version of your Tx and Rx programs that take account of my earlier advice

Transmitter Code:

#include <XBee.h>
#include <time.h>
#include <stdlib.h>
XBee xbee = XBee();
XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0x4147FE2A);
XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1);
uint8_t input = 0;
void setup() 
{
  Serial.begin(9600);
  xbee.setSerial(Serial);
  Serial.println("Stating Up!");
  srand((unsigned)time(NULL));
}

void loop() 
{
  uint8_t data[3];
  uint8_t receivedChar = '0';
  boolean newData = false;
  data[0] = '6';
  data[1] = rand()%256;
  data[2] = ',';
  data[3] = rand()%256;
  ZBTxRequest zbTx1 = ZBTxRequest(ROUTER1, data, sizeof(data));
  ZBTxRequest zbTx2 = ZBTxRequest(ROUTER2, data, sizeof(data));
  ZBTxRequest zbTx3 = ZBTxRequest(ROUTER3, data, sizeof(data));
  ZBTxRequest zbTx4 = ZBTxRequest(ROUTER4, data, sizeof(data));
  ZBTxRequest zbTx5 = ZBTxRequest(ROUTER5, data, sizeof(data));
  ZBTxRequest zbTx6 = ZBTxRequest(ROUTER6, data, sizeof(data));
  
  delay(500);
  Serial.println("Start Transmitting");
  Serial.print("Data Sent:\t");
  Serial.print(data[0]);
  Serial.print(data[1]);
  Serial.print(data[2]);
  Serial.println(data[3]); 
  delay(500);
  if (Serial.available() > 0) 
  {
    receivedChar = Serial.read();
    newData = true;
  }
  if (newData == true) 
  {
    Serial.print("Input: ");
    Serial.println(receivedChar);
    newData = false;
    switch(receivedChar)
    {
      case '1':
        Serial.println("To Router 1");
        xbee.send(zbTx1);
        Serial.println();
        delay(500);
        break;
      case '2': 
        Serial.println("To Router 2");
        xbee.send(zbTx2);
        Serial.println();
        delay(500);
        break;
      case '3': 
        Serial.println("To Router 3");
        xbee.send(zbTx3);
        Serial.println();
        delay(500);
        break;
      case '4': 
        Serial.println("To Router 4");
        xbee.send(zbTx4);
        Serial.println();
        delay(500);
        break;
      case '5':
        Serial.println("To Router 5");
        xbee.send(zbTx5);
        Serial.println();
        delay(500);
        break;
      default: 
        Serial.println("Wrong input entered");
        break;
    }
  } 
}

Receiver Code:

#include <XBee.h>
XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
uint8_t count = 0;
String sample = "";
void setup() 
{
  Serial.begin(9600);
  xbee.begin(Serial);
}
void loop()
{
  int receivedData[3];
  byte* dataPointer;
  xbee.readPacket(500);
  Serial.println("Reading for Packet");
  if(xbee.getResponse().isAvailable())
  {
    Serial.print("Packet Available: ");
    Serial.println(count);
    delay(500);
    if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
      xbee.getResponse().getZBRxResponse(rx);
      delay(300);
      dataPointer = reinterpret_cast<byte *>(receivedData);
      for(int n =0; n < rx.getDataLength(); n++)
      {
        *dataPointer = rx.getData(n);
        dataPointer += 1;
      }
      Serial.print("Packet Received: ");
      for (byte n = 0; n < 3; n++) 
      {
        Serial.println(receivedData[n]);
      }
      Serial.print("count: ");
      count++;
      Serial.println(count);
      delay(1500);
    }
  }
  else if(xbee.getResponse().isError())
  {
    Serial.print("Error Reading Packet. Error Code: ");
    Serial.println(xbee.getResponse().getErrorCode());
    delay(500);
  }
}

I'm attaching my output on the serial monitor. You can find them in the attachments.

Also, the code was working there was no compiling error.

And tell us in detail what happens when you run them

In the attachment, when we transmit a message in USB Mode (@Figure: Transmitter_USB), the input can be seen on the Monitor. However, when we switch it to the XBEE Mode (@Figure: Transmitter_XBEE), on the Monitor, no input is accepted by the Arduino. On the receiver side, the output remains constant in both the USB and the XBEE modes.

Priyanshu27:
I'm attaching my output on the serial monitor. You can find them in the attachments.

Please don't post pictures of text - just copy and paste your text.

And if posting images (for other reasons) please display them in your post so we can see them without downloading them. See this Simple Image Guide

I looked at your programs, but I need to see the output.

I think I asked before and you did not say why there are all these lines

XBeeAddress64 ROUTER1 = XBeeAddress64(0x0013A200,0x4147FE2A);
XBeeAddress64 ROUTER2 = XBeeAddress64(0x0013A200,0x4147FE2B);
XBeeAddress64 ROUTER3 = XBeeAddress64(0x0013A200,0x4147FE2E);
XBeeAddress64 ROUTER4 = XBeeAddress64(0x0013A200,0x414E65AA);
XBeeAddress64 ROUTER5 = XBeeAddress64(0x0013A200,0x414E65AE);
XBeeAddress64 ROUTER6 = XBeeAddress64(0x0013A200,0x414E65B1);

...R

And if posting images (for other reasons) please display them in your post so we can see them without downloading them. See this Simple Image Guide

The outputs I've attached in Reply #36, I'm attaching them again as directed in the link you provided.

I looked at your programs, but I need to see the output.

Transmitter_USB: When the jumpers of the shield are in USB Mode.

Transmitter_XBEE: When the jumpers are switched in XBee Mode.

Receiver: The output on the receiving side.

I think I asked before and you did not say why there are all these lines

I'm afraid you didn't ask that, but, I'll tell you what it tells.

These lines are defining the respective Router's 64-bit MAC Address. Now, when you want to transmit a message from Router 6 to Router 5 (say), you can see zbTx5 in the Transmitter Code. This zbTx5 contains the MAC Address of Router 5, the data we are transmitting and the size of the data which is predefined variables in ZBTxRequest() function of the XBee library.

I hope I answered your queries, but I think that you shall be asking me for the data I'm sending to explain.
So as you can see in the Transmitter_USB image data is 5410244161 when sent to Router 5, it means, 54 is representing '6' which the Router from which message is transmitted, 102 is the x-coordinate, 44 is the ASCII value of "," (comma) and 161 is the y-coordinate. So when we receive it at the receiver end after storing in an array which you suggested, we can separate the coordinates by seeing 54 and 44 position in the data.