XBee

From embeddedTS Manuals
XBEE
Released Mar. 2010
Documentation
Datasheet
Product Manual
Mechanical Drawing
Digi International

Overview

Many of our boards support the XBEE radios which can be used for long distance communication and mesh networking using the ZigBee protocols.

Getting Started

Digi offers the best introductions to these products:

XBee Learn More XBee 802.15.4 Digital Input/Output Line Passing

For programming with their series the Linux community has created libraries that make this very convenient.

  • libxbee is a C/C++ API for series 1, 2, and 5 XBEE modules in API mode.
  • python-xbee is a python module for API and command mode
  • xbee-api is a java API for Series 1 and 2 in API mode.

Programming Example

This source example assumes the baud rate is already set up to 9600 and that you are using a series 1 XBEE module. Keep in mind that you can reprogram the baud rate that the XBEE module will use. First set up the UART before running your application:

eval $(xuartctl --server --port 3 --speed 9600 2>&1); ln -s $ttyname /dev/ttyxuart3
 
# Now that the xuart device is created you can start your application:
myapp &

This is an example application that will check for the "OK" return from +++. For real usage of the XBEE you will want to use one of the APIs listed above.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <strings.h>

#define XBEEDEVICE "/dev/ttyxuart3"

int main(int argc, char **argv)
{
        int fd, c, res;
        struct termios oldtio, newtio;
        char buf[255] = {0};
        
        fd = open(XBEEDEVICE, O_RDWR | O_NOCTTY ); 
        if(fd <0) 
        {
                perror(XBEEDEVICE); 
                return -1;
        }
        
        tcgetattr(fd, &oldtio); /* save current port settings */
        
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;

        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
         
        newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
        newtio.c_cc[VMIN]     = 2;   /* blocking read until 2 chars received */
        
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd, TCSANOW, &newtio);

        // Sending +++ within 1 second sets the XBee into command mode
        write(fd, "+++", 3);

        res = read(fd, buf, 255);
        buf[res] = 0;

        if(0 == strncmp(buf, "OK", 2))
        {
                printf("XBee Detected\n");
        }
        else
        {
                printf("Could not find XBee\n");
        }

        tcsetattr(fd, TCSANOW, &oldtio);

        return 0;
}