代码之家  ›  专栏  ›  技术社区  ›  ryanday

串行端口不发送空值

  •  1
  • ryanday  · 技术社区  · 15 年前

    我在玩XBee收音机,我在使用Linux(Ubuntu9.10),XBee在使用我的代码时似乎不会通过串行端口发送空值。当我使用XCTU程序(在单独的Windows设备上随XBEE提供的股票术语模拟器)时,当新的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的端口,没有流量控制。您可以看到我也在使用串行USB驱动程序,但由于我确实获得了数据,所以我很确定该部分工作正常。

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

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

    谢谢你的帮助!

    2 回复  |  直到 12 年前
        1
  •  6
  •   sth    15 年前

    初始化 c_cflags 看起来是错误的,通过使用位否定,你基本上设置了 全部的 旁边的比特 CRTSCTS :

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

    你应该省去 CRTSCTS公司 如果不应该设置这个标志。

        2
  •  0
  •   tomlogic    12 年前

    Digi已经发布 xbee_ansic_library ,一个开放源码(MPL 2.0)的ANSIC代码库,用于在API模式下与XBEE模块通信。它支持POSIX(Linux、BSD、Mac OS X、Cygwin)、Windows(mingw/msys)、DOS(openwatcom)和一些嵌入式平台。

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