Question

I'm playing with an XBEE radio, I'm using Linux (Ubuntu 9.10) and the XBEE doesn't appear to send NULL values through the serial port when using MY code. When I use the XCTU program(stock term emulator that comes with the XBEE on a seperate windows box), I see this output through the serial port when a new XBEE joins the network:

7E 00 20 95 00 13 A2 00 40 3B

etc... perfect. But, using MY code, when a new XBEE joins the network I see this:

7E 20 95 13 A2 40 3B

Here is how I'm opening the serial port

struct termios options;
int port;

port = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK);
tcgetattr(port, &options);
bzero(&options, sizeof(options));

options.c_cflag = B9600 | ~CRTSCTS | CS8 | CLOCAL | CREAD;

tcsetattr(port, TCSANOW, &options);

I have my theories about what that code does, but my theories are obviously wrong. I'm trying to open the port with 9600, 8N1, No Flow control. You can see I'm also using the serial->USB driver, but since I do seem to get data I'm pretty sure that part is working.

My guess is when I bzero options, I'm making 0x00 a control char? I'm not sure. When I DON'T bzero options I can only read 5 bytes at a time and I lose data. It feels like I'm having a flow control or a baud rate problem, so I bzero() and now I don't get NULLs.

I've also just used Minicom on my Linux system and captured the output. I get the same information, no NULLs(this really messes up packet sizes for those unfamiliar with the protocol). Could my code have set the serial port into a state that minicom isn't changing? I'm lost.

Thanks for the help!

Was it helpful?

Solution

The initialization of the c_cflags looks wrong, by using bitwise negation you basically set all the bits beside CRTSCTS:

options.c_cflag = ... | ~CRTSCTS | ...;

You should just leave out CRTSCTS if that flag should not be set.

OTHER TIPS

Digi has released xbee_ansic_library, an Open Source (MPL 2.0) library of ANSI C code for communicating with XBee modules in API mode. It supports POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW/MSYS), DOS (OpenWatcom) and some embedded platforms.

It might be of interest if you're still writing C code in Ubuntu.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top