XBee

From embeddedTS Manuals
Revision as of 16:46, 25 June 2012 by Mark (talk | contribs)
XBEE
Xbee.jpg
Released Mar. 2010
Documentation
Datasheet
Product Manual
Mechanical Drawing
Digi International
[ libxbee]

Overview

Many of our boards support the XBEE radios which can be used for long distance communication and mesh networking using the [ZigBee http://en.wikipedia.org/wiki/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;
}