串行端口不发送NULL值

时间:2009-12-22 01:18:17

标签: c linux serial-port xbee

我正在使用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不会改变的状态吗?我输了。

感谢您的帮助!

2 个答案:

答案 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代码,可能会感兴趣。