0

Xbee を介してリモート センサーからデータを受信し、Xbee を介してメッセージを書き戻す Raspberry Pi Model B に C++ プログラムがあります。Xbee を Sparkfun XBee Explorer USB 経由で接続すると、毎回完璧に動作します。しかし、RPi シリアル ポートを使用してまったく同じコードを実行すると、着信メッセージは常に受信されますが、出力メッセージは再起動後にシリアル ポートから Xbee に数回書き込まれ、その後は二度と書き込まれません。ロジック プローブを GND、TXD、および RXD ピンに接続していて、送受信パケットを確認できるため、シリアル ポートから Xbee への出力がないことはわかっています。また、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) が突然 Low になり、Low のままになります。その後、再起動しないとそれ以上の出力はできません。RxD ラインは引き続き完全に機能します。私は 2 つの RP を持っていますが、これは両方で 1 分から 30 分の間に発生します。なぜこれが起こるのか、そしてもっと重要なことに、私に何ができるのかについて、誰か私に手がかりを教えてもらえますか? 私は絶望的です。これは、私が考えることができるすべてをテストするのに何日もかかりすぎた後、私を夢中にさせています.

4

1 に答える 1

0

問題が解決しました!それは私が思っていた問題ではなく、もちろん私自身のせいです。まず、私は間違った場所を探していました。C++ コードに問題はありませんでした。私のプロジェクトは Ruby on Rails を使用して構築されており、Raspberry Pi 用の 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 に答える