0

我在 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,这发生在他们两个身上,时间介于一分钟到半小时之间。谁能告诉我为什么会发生这种情况,更重要的是,我能做些什么?我很绝望。在测试了我能想到的所有东西之后,这让我发疯了。

4

1 回答 1

0

问题解决了!这不是我认为的问题,当然这是我自己的错。首先,我找错地方了。C++ 代码没有任何问题。我的项目是使用 Ruby on Rails 构建的,我使用树莓派的 Wiring Pi ( http://wiringpi.com ) GPIO 接口库来控制外部继电器。当我将引脚编码为最初关闭时,我不小心(愚蠢地)使用了我想要的插头引脚 (15) 作为 Wiring Pi 引脚编号。接线 Pi 引脚 15 实际上是 GPIO 引脚 8,而 GPIO 引脚 8 是 UART 发送 (TxD) 引脚。所以结果是 Raspberry Pi 完全按照我说的去做:强制 TxD 为 LOW。显然,一旦你这样做了,不管你告诉串行驱动程序做什么,引脚都会保持低电平。

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

于 2013-12-01T20:49:56.360 回答