Simple Display Serial Data via Xbee

Hi All,

I’ve got a question, simple one I think but I cant get it to work, I’ve got an Xbee connected to one Arduino Uno sending data at 115200 Baud and the same set up receiving data, but the receiving Arduino isn’t showing up anything tangible when I look on the serial monitor I just get -1’s in a line. But when I check the sending unit I get all my data formatted nicely in the serial monitor. So my question is why isnt the same data showing up on my receiving end?

Sorry if that doesn’t make much sense its getting late here.

Cheers,

Jake

So my question is why isnt the same data showing up on my receiving end?

Either the XBees are not configured correctly (you failed to mention how they are configured, or even what type they are), the XBees are not connected correctly (you seemed to have failed to mention how they are connected), or the code on the Arduinos is wrong (you seemed to have posted that in the invisible, 0 point font).

Good luck.

Sorry my bad, okay I know the Xbees are set up correctly as I set up a simple project using a Potentiometer on one and displaying the value in the serial monitor on the other, the Xbees are set to 115200 Baud.

Im using a GPS example from the TinyGPS lib code is as follows -

Sending

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 9(rx) and 8(tx).
*/

TinyGPS gps;
SoftwareSerial nss(9, 8);

static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial.begin(115200);
  nss.begin(4800);

  Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time       Date Alt     Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();
  
  // Every second we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }
  
  gpsdump(gps);
}

static void gpsdump(TinyGPS &gps)
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

  print_date(gps);

  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  feedgps();
}

static void print_float(float val, float invalid, int len, int prec)
{
  char sz[32];
  if (val == invalid)
  {
    strcpy(sz, "*******");
    sz[len] = 0;
        if (len > 0) 
          sz[len-1] = ' ';
    for (int i=7; i<len; ++i)
        sz[i] = ' ';
    Serial.print(sz);
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1);
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(" ");
  }
  feedgps();
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("*******    *******    ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  feedgps();
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  feedgps();
}

static bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

and on the receiving i’ve got

void setup()
{
 //Start Serial
 Serial.begin(115200);
 delay(500);
}

void loop()
{  

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

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

Cheers,

Jake

and on the receiving i've got

  Serial.println(data);
  Serial.flush();

Why? You are sending char data to the Arduino. Why are you storing the char in an int? Given that you just read a character from the XBee, why are you sending the data back to the XBee? Why are you then blocking until the data has been shifted out?

I asked this question on G+ and someone suggested that might be the answer. Clearly not :frowning:

The first question that you need address is this. Do you want to use the Serial instance to talk to the XBee OR the PC? Both is the wrong answer.

Then, it would help if you went back and answered all the questions that have been asked.

What i'm aiming to do is get the Arduino with the GPS module to send the data to an Arduino connected to my computer and see the data on the computer.

With a test I did using a Pot I could see the value of the pot using the serial monitor on the receiving Xbee, I'm aiming to replicate that but using the GPS data.

Cheers,

The Arduino at the PC end doesn't care how the other Arduino gets the data. If the XBees communicate, the Arduinos send/receive data with one sketch on the remote end, they will still communicate when you change the sketch on the remote end, UNLESS you do something in that sketch that interferes with the hardware serial port.

Since you appear to now have a failure to communicate, I'd suggest that the XBees are not the problem. So, remove them from the picture. Remove the Arduino from the PC end, too. Connect the remove Arduino with the GPS directly to the PC. Do you get data from the GPS on the PC?

Okay I removed the Xbee and just left the GPS, opened the serial Monitor and screen shot it (attached), I believe that the increasing RX Char value means that the GPS unit is working correctly, I took it outside earlier today and did indeed get a connection.

Cheers for the help PaulS

Success, after changing the data coming in via the Xbee its now working as intended :slight_smile: