Linux Raspberry Pi卡在串行输出端口上,无法写入Xbee 我在树莓PI模型B上有一个C++程序,它通过XBee从远程传感器接收数据,然后通过XBee编写消息。当我通过Sparkfun Xbee浏览器USB连接Xbee时,每次都能正常工作。但是,如果我使用RPi串行端口运行完全相同的代码,则始终会收到传入消息,但在重新启动后,输出消息会从串行端口写入Xbee几次,然后再也不会写入。我知道没有从串行端口到Xbee的输出,因为我有一个逻辑探针连接到GND、TXD和RXD引脚,我可以看到输入和输出数据包。此外,RPi程序为传入和传出的数据包编写调试消息,这两种消息都在应该的时候发生。我只是将RPi GPIO上的3.3V、GND、TXD和RXD引脚连接到相应的Xbee引脚。RPi正在运行2013-09-10-wheezy-raspbian版本。波特率为38400

Linux Raspberry Pi卡在串行输出端口上,无法写入Xbee 我在树莓PI模型B上有一个C++程序,它通过XBee从远程传感器接收数据,然后通过XBee编写消息。当我通过Sparkfun Xbee浏览器USB连接Xbee时,每次都能正常工作。但是,如果我使用RPi串行端口运行完全相同的代码,则始终会收到传入消息,但在重新启动后,输出消息会从串行端口写入Xbee几次,然后再也不会写入。我知道没有从串行端口到Xbee的输出,因为我有一个逻辑探针连接到GND、TXD和RXD引脚,我可以看到输入和输出数据包。此外,RPi程序为传入和传出的数据包编写调试消息,这两种消息都在应该的时候发生。我只是将RPi GPIO上的3.3V、GND、TXD和RXD引脚连接到相应的Xbee引脚。RPi正在运行2013-09-10-wheezy-raspbian版本。波特率为38400,linux,serial-port,raspberry-pi,xbee,Linux,Serial Port,Raspberry Pi,Xbee,这是串行端口初始化: fcntl(fd, F_SETFL, 0); // Clear the file status flags struct termios options; tcgetattr(fd, &options); // Get the current options for the port options.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP |

这是串行端口初始化:

fcntl(fd, F_SETFL, 0);      // Clear the file status flags
struct termios options;
tcgetattr(fd, &options);    // Get the current options for the port
options.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON);
options.c_oflag &= ~(OCRNL | ONLCR | ONLRET | ONOCR |  OFILL | OLCUC | OPOST);
options.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
if (cfsetispeed(&options, B38400) < 0 || cfsetospeed(&options, baudRate) < 0) {
  throw runtime_error("Unable to set baud rate");
}
if (tcsetattr(fd, TCSAFLUSH, &options) < 0) {
  throw runtime_error("Could not set tty options");
}
FD_ZERO(&set);    // clear the set
FD_SET(fd, &set); // add file descriptor to the set
sleep(1);
fcntl(fd,F_SETFL,0);//清除文件状态标志
结构termios选项;
tcgetattr(fd和选项);//获取端口的当前选项
options.c|u iflag&=~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON);
选项c.u of lag&=~(OCRNL | ONLCR | ONLRET | ONOCR | OFILL | OLCUC | OPOST);
options.c|lflag&=~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
选项c|u cflag |=(CLOCAL | CREAD);
options.c_cflag&=~PARENB;
options.c_cflag&=~CSTOPB;
options.c_cflag&=~CSIZE;
选项c|u cflag |=CS8;
if(cfsetispeed(&options,B38400)<0 | | cfsetospeed(&options,波特率)<0){
抛出运行时_错误(“无法设置波特率”);
}
if(tcsetattr(fd、TCSAFLUSH和选项)<0){
抛出运行时_错误(“无法设置tty选项”);
}
FD_ZERO(&set);//清理场地
FD_集(FD,&SET);//将文件描述符添加到集合中
睡眠(1);

在仔细观察逻辑分析仪时,我可以看到发生了什么。RPi TxD线路(GPIO引脚8)突然变低并保持在低位。如果不重新启动,则无法进一步输出。RxD生产线继续完美工作。我有两个RPI,这两个都会发生,在一分钟到半小时之间。有谁能告诉我为什么会发生这种情况,更重要的是,我能做些什么?我绝望了。经过了太多天对我能想到的所有东西的测试,这让我发疯。

问题解决了!这不是我想的问题,当然是我自己的错。首先,我找错地方了。C++代码没有什么问题。我的项目是使用RubyonRails构建的,我使用Raspberry Pi的Wiring Pi()GPIO接口库来控制外部继电器。当我将管脚编码为最初关闭时,我意外地(愚蠢地)使用了我想要的标题管脚(15)作为接线管脚编号。接线Pi引脚15实际上是GPIO引脚8,GPIO引脚8是UART传输(TxD)引脚。所以结果是树莓圆周率完全按照我告诉它的做了:强制TxD降低。显然,一旦你这样做了,不管你告诉串行驱动程序做什么,pin码都会保持低位

这么多小时的工作才发现这样一个愚蠢的错误。感谢所有花时间看我问题的人