我正在使用XBEE收音机,我正在使用Linux(Ubuntu 9.10),并且在使用MY代码时,XBEE似乎没有通过串口发送NULL值。当我使用XCTU程序(XBEE附带的股票模拟器在一个单独的Windows框中)时,当新的XBEE加入网络时,我通过串口看到这个输出:
7E 00 20 95 00 13 A2 00 40 3B
等等......完美。但是,使用我的代码,当一个新的XBEE加入网络时,我看到了这一点:
7E 20 95 13 A2 40 3B
以下是我打开串口的方法
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);
我有关于代码的作用的理论,但我的理论显然是错误的。我正在尝试用9600,8N1,No Flow控件打开端口。你可以看到我也在使用serial-> USB驱动程序,但由于我似乎得到了数据,我很确定这部分是有用的。
我的猜测是当我使用bzero选项时,我将0x00作为控制字符?我不确定。当我不做bzero选项时,我一次只能读取5个字节而丢失数据。感觉我有流控制或波特率问题,所以我bzero()现在我没有得到NULL。
我也在我的Linux系统上使用了Minicom并捕获了输出。我得到相同的信息,没有NULL(这对于那些不熟悉协议的人来说真的会混淆数据包大小)。我的代码可以将串口设置为minicom不会改变的状态吗?我输了。
感谢您的帮助!
答案 0 :(得分:6)
c_cflags
的初始化看起来不对,通过使用按位否定,您基本上将{em> all 设置为CRTSCTS
旁边的位:
options.c_cflag = ... | ~CRTSCTS | ...;
如果不应设置该标志,则应该忽略CRTSCTS
。
答案 1 :(得分:0)
Digi发布了xbee_ansic_library,这是一个ANSI C代码的开源(MPL 2.0)库,用于在API模式下与XBee模块进行通信。它支持POSIX(Linux,BSD,Mac OS X,Cygwin),Windows(MinGW / MSYS),DOS(OpenWatcom)和一些嵌入式平台。
如果您仍在Ubuntu中编写C代码,可能会感兴趣。