This shows you the differences between two versions of the page.
random:a_simple_serial_program_to_check_the_xbee [2013/02/16 19:00] |
random:a_simple_serial_program_to_check_the_xbee [2013/02/16 19:00] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ===== A simple serial program for the XBee ===== | ||
+ | |||
+ | This program checks for the presence of an XBee module in the TS-7553 socket. | ||
+ | |||
+ | Note that the XBee is connected to a serial port in the FPGA. The serial port needs to be activated by xuartctl before it can be used. | ||
+ | |||
+ | <code> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <sys/select.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <termios.h> | ||
+ | #include <stdio.h> | ||
+ | #include <strings.h> | ||
+ | #include <unistd.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/time.h> | ||
+ | |||
+ | int main( int argc, char **argv ){ | ||
+ | int fd, res, n; | ||
+ | struct termios oldtio, newtio; | ||
+ | char buf[255] = {0}, *c; | ||
+ | char comport[255]; | ||
+ | const char cmd[] = "xuartctl --server --port 3 --speed 9600 2>&1"; | ||
+ | FILE *fp; | ||
+ | fd_set input; | ||
+ | struct timeval timeout; | ||
+ | |||
+ | // setup com port using xuartctl | ||
+ | fp = popen( cmd, "r" ); | ||
+ | while( fgets( buf, sizeof buf, fp )){ | ||
+ | //printf( "Received: %s-\n", buf ); | ||
+ | c = strchr( buf, '=' ); | ||
+ | strcpy( comport, c+1 ); | ||
+ | *(comport+strlen(comport)-1) = 0; // remoew new line | ||
+ | printf( "Using port %s\n", comport ); | ||
+ | } | ||
+ | pclose( fp ); | ||
+ | |||
+ | // open port | ||
+ | fd = open( comport, O_RDWR | O_NOCTTY ); | ||
+ | if( fd < 0 ){ | ||
+ | // nope, bail | ||
+ | perror( comport ); | ||
+ | return( -1 ); | ||
+ | } | ||
+ | |||
+ | // ----- Configure port ----- | ||
+ | // save current port settings | ||
+ | tcgetattr( fd, &oldtio ); | ||
+ | // define timeout | ||
+ | timeout.tv_sec = 3; | ||
+ | timeout.tv_usec = 0; | ||
+ | // define new terminal structure | ||
+ | bzero( &newtio, sizeof( newtio )); | ||
+ | newtio.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD; | ||
+ | newtio.c_iflag = IGNPAR; | ||
+ | cfsetispeed( &newtio, B9600 ); | ||
+ | cfsetospeed( &newtio, B9600 ); | ||
+ | newtio.c_oflag = 0; | ||
+ | | ||
+ | newtio.c_lflag = 0; // set input mode (non-canonical, no echo,...) | ||
+ | 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 | ||
+ | printf( " Sending +++\n" ); | ||
+ | write( fd, "+++", 3 ); | ||
+ | |||
+ | // initialize "input" to contain fd: | ||
+ | FD_ZERO( &input ); | ||
+ | FD_SET( fd, &input ); | ||
+ | n = select( fd+1, &input, NULL, NULL, &timeout ); | ||
+ | | ||
+ | if( n < 0 ) | ||
+ | printf( "select() failed\n" ); | ||
+ | else if( n == 0 ) | ||
+ | printf( "TIMEOUT, no XBee\n" ); | ||
+ | else{ | ||
+ | res = read( fd, buf, 250 ); | ||
+ | buf[res] = 0; | ||
+ | //printf( "Received: %s\n", buf ); | ||
+ | if( 0 == strncmp( buf, "OK", 2 )){ | ||
+ | printf( "XBee Detected\n" ); | ||
+ | }else{ | ||
+ | printf( "Something else responded!\n" ); | ||
+ | } | ||
+ | } | ||
+ | tcsetattr( fd, TCSANOW, &oldtio ); | ||
+ | return( 0 ); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | To make the program, name this file "hello.c: and simply type "make hello" at the command line. | ||
+ | |||
+ | |||