【问题标题】:Serial port doesn't send NULL values串口不发送 NULL 值
【发布时间】:2009-12-22 01:18:16
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 您是否清除了c_cc[] 数组?这可能允许传递空值(和其他控制字符)。您是否有一个板载(非 USB)串行端口,可用于探测不在 USB 驱动程序中的问题?

标签: c linux serial-port xbee


【解决方案1】:

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

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

如果不应该设置该标志,你应该忽略 CRTSCTS

【讨论】:

  • 不仅成功了,我的校验和功能第一次成功了!第 2 步,了解 ~ 运算符。
【解决方案2】:

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 代码,这可能会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2020-06-10
    • 1970-01-01
    • 2014-04-09
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多