1

我正在使用 XBEE 收音机,我使用的是 Linux(Ubuntu 9.10),并且在使用我的代码时,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 control 打开端口。您可以看到我也在使用串行-> USB 驱动程序,但由于我似乎确实获得了数据,所以我很确定该部分正在工作。

我的猜测是当我使用 bzero 选项时,我将 0x00 设为控制字符?我不知道。当我不使用零选项时,我一次只能读取 5 个字节并且我会丢失数据。感觉就像我有流量控制或波特率问题,所以我 bzero() 现在我没有得到 NULL。

我还刚刚在我的 Linux 系统上使用了 Minicom 并捕获了输出。我得到了相同的信息,没有 NULL(对于那些不熟悉协议的人来说,这确实会弄乱数据包的大小)。我的代码是否可以将串行端口设置为 minicom 不会改变的状态?我迷路了。

谢谢您的帮助!

4

2 回答 2

6

看起来错误的初始化c_cflags,通过使用按位否定,您基本上设置了旁边的所有CRTSCTS位:

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

如果不应CRTSCTS设置该标志,则应省略。

于 2009-12-22T01:30:30.057 回答
0

Digi 发布了xbee_ansic_library,这是一个开源 (MPL 2.0) ANSI C 代码库,用于在 API 模式下与 XBee 模块进行通信。它支持 POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW/MSYS), DOS (OpenWatcom) 和一些嵌入式平台。

如果您仍在 Ubuntu 中编写 C 代码,您可能会感兴趣。

于 2012-12-07T17:25:13.260 回答