Raspberry Pi 卡住串行输出端口写入 Xbee
Posted
技术标签:
【中文标题】Raspberry Pi 卡住串行输出端口写入 Xbee【英文标题】:Raspberry Pi stuck serial output port writing to Xbee 【发布时间】:2013-11-11 23:16:50 【问题描述】:我在 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,这发生在他们两个身上,时间在一分钟到半小时之间。谁能告诉我为什么会发生这种情况,更重要的是,我能做些什么?我很绝望。在测试了我能想到的所有东西之后,这让我发疯了。
【问题讨论】:
【参考方案1】:问题解决了!这不是我认为的问题,当然这是我自己的错。首先,我找错地方了。 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。显然,一旦你这样做了,不管你告诉串行驱动程序做什么,引脚都会保持低电平。
这么多小时的工作才发现这样一个愚蠢的错误。感谢所有花时间查看我的问题的人。
【讨论】:
以上是关于Raspberry Pi 卡住串行输出端口写入 Xbee的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Apache Web 服务器控制 Raspberry Pi 的串行 GPIO 引脚
在 USB 端口上读取串行通信时接收空数据 - Raspberry Pi 3 型号 B+
Raspberry pi不会使用minicom或python将串行数据发送到arduino
Raspberry Pi 和 Arduino 之间的简单 2 路串行通信
Arduino Uno Raspberry Pi 串行通信双读数
sh 启用和禁用Raspberry Pi上的HDMI端口:`rpi-hdmi on`打开,`rpi-hdmi off`关闭。 X正确地重新初始化了