我在玩XBEE收音机,我在用Linux(Ubuntu9.10),XBEE在使用我的代码时似乎不会通过串行端口发送空值。当我使用xctu程序(在单独的windows框中附带xbee的stock term模拟器)时,当一个新的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打开端口,没有流量控制。你可以看到我也在使用serial->usb驱动程序,但因为我似乎确实得到了数据,所以我很确定这部分工作正常。
我猜当我没有选项的时候,我会把0x00变成一个控制字符?我不确定。当我没有bzero选项时,我一次只能读取5个字节,并且会丢失数据。感觉好像我有一个流量控制或波特率问题,所以我bzero()现在没有得到空值。
我也刚刚在我的linux系统上使用了minicom并捕获了输出。我得到了相同的信息,没有空值(对于不熟悉协议的人来说,这真的会弄乱数据包的大小)。我的代码能把串行端口设置成minicom没有改变的状态吗?我迷路了。
谢谢你的帮助!
最佳答案
c_cflags
的初始化看起来是错误的,通过使用按位求反,您基本上设置了CRTSCTS
旁边的所有位:
options.c_cflag = ... | ~CRTSCTS | ...;
如果不应设置该标志,则应省略
CRTSCTS
。关于c - 串口不发送NULL值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1943655/