我在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线继续正常工作。我有两个RPis,它们都发生在它们之间,大约在一分钟到半小时之间。谁能给我一个线索,说明为什么会发生这种情况,更重要的是,我能对此做些什么?我很绝望。经过太多时间测试我能想到的一切,这使我发疯。
最佳答案
问题解决了!这不是我认为的问题,当然是我自己的错。首先,我在错误的地方寻找。 C ++代码没有错。我的项目是使用Ruby on Rails构建的,并且我使用Raspberry Pi的Wiring Pi(http://wiringpi.com)GPIO接口库来控制外部继电器。当我将针脚编码为最初关闭时,我不小心(愚蠢地)使用了我想要的插头针脚(15)作为Wi-Fi Pi针脚编号。接线Pi引脚15实际上是GPIO引脚8,而GPIO引脚8是UART发送(TxD)引脚。因此结果是Raspberry Pi完全按照我的要求去做:将TxD设置为LOW。显然,一旦您执行了此操作,则告诉串行驱动器做什么都无关紧要,该引脚将保持低电平。
这么多小时的工作才发现这种愚蠢的错误。感谢所有花时间研究我的问题的人。
关于linux - 树莓派卡住串行输出端口写入Xbee,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19917899/