我在Raspberry Pi Model B上有一个C ++程序,它通过Xbee从远程传感器接收数据,然后通过Xbee写回消息。当我通过Sparkfun XBee Explorer USB连接Xbee时,它每次都能完美运行。但是,如果我使用RPi串行端口运行完全相同的代码,则始终接收传入消息,但输出消息在重新启动后从串行端口写入Xbee几次,然后再也不会。我知道从串口到Xbee没有输出,因为我有一个逻辑探头连接到GND,TXD和RXD引脚,我可以看到输入和输出数据包。此外,RPi程序为传入和传出的数据包写入调试消息,并且两者都应该发生。我只是将RPi GPIO上的3.3V,GND,TXD和RXD引脚连接到相应的Xbee引脚。 RPi正在运行2013-09-10-wheezy-raspbian版本。波特率为38400。
这是串口初始化:
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);
仔细观察逻辑分析仪,我可以看到发生了什么。 RPi TxD线(GPIO引脚8)突然变为低电平并保持低电平。如果没有重启,则无法进一步输出。 RxD系列继续完美运行。我有两个RP,这两个都发生在两分钟到半小时之间。任何人都可以告诉我为什么会发生这种情况,更重要的是,我可以做些什么呢?我很绝望。经过太多时间测试我能想到的一切,这让我发疯了。
答案 0 :(得分:0)
问题解决了!这不是我认为的问题,当然这是我自己的错。首先,我在错误的地方寻找。 C ++代码没有任何问题。我的项目是使用Ruby on Rails构建的,我使用Wiring Pi(http://wiringpi.com)GPIO接口库为Raspberry Pi控制外部中继。当我将引脚编码为最初关闭时,我不小心(愚蠢地)使用了我想要的标题引脚(15)作为接线Pi引脚编号。接线Pi引脚15实际上是GPIO引脚8,GPIO引脚8是UART发送(TxD)引脚。结果是Raspberry Pi完全按照我的要求做了:强制TxD为LOW。显然,一旦你这样做,你告诉串口驱动程序要做什么并不重要,引脚会保持低电平。
这么多小时的工作找到了这样一个愚蠢的错误。感谢所有花时间看我问题的人。