1

arduino ボードで 2 つのソフトウェア シリアル ポートを使用して 2 つのセンサーからデータを取得するのに問題があります。同様の質問が以前に尋ねられた可能性があることに気付きましたが、答えはそれができないことを示唆しており、ここの例に基づいてそれができることを十分に知っています(http://arduino.cc/en/Tutorial/TwoPortReceive)!

私はarduinoイーサネットを使用しています。私がデータを取得しようとしているデバイスには、sparkfun の GPS と IMU が含まれています。

ソフトウェア シリアル ポートだけを使用していずれかのデバイスからデータを取得できますが、2 つ目のソフトウェア シリアル ポートを追加するとすぐに、どちらのポートも動作しません。ハードウェアのシリアル ポートが別のデバイスで使用されているため、使用できません。

私のコードは例とまったく同じです:

#include <SoftwareSerial.h>

SoftwareSerial portOne(7,8);
SoftwareSerial portTwo(5,6);

void setup()
{
  Serial.begin(9600);


  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop()
{

  portOne.listen();
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  delay(500);

  portTwo.listen();
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  Serial.println();
}

アイデアのある人はいますか?

4

3 に答える 3

3

このコードは機能しないか、機能する場合でも十分に機能しません。SoftwareSerial には内部バッファが 1 つしかありません。はい、複数の SoftwareSerial オブジェクトを存在させることができますが、そのうちの 1 つだけが内部バッファーを制御します。いずれかの RX ピンがアサートされると、割り込みが生成されますが、listen() している RX ピンのみが開始ビットをチェックされます。

本当に必要なのは、開始ビットから割り込みが発生したときに複数のピンをチェックする機能です。次に、適切なデータ構造へのポインタを設定する必要があります。複雑ですが、可能です。

または、割り込み駆動の受信をあきらめて、両方/すべての RX ピンをチェックし、表示されているピンに基づいて受信を開始することもできます。このコードには多くの毛があり、動作させるにはオシロスコープが必要になることに注意してください。

同様の問題が発生しているため、センサーを見つけました。同僚と話し合った結果、センサーを順番に読み取ることにしました。当社のセンサーは、特定のイベントではなくセンサーの現在の状態を報告するため、レポートが失われても問題ありません。したがって、ポート 1 から読み取り、次にポート 2、ポート 1 の順に読み取ります。センサーはテキスト行を吐き出すので、次のセンサーにいつ切り替えるかがわかります。

于 2013-04-17T18:06:41.523 に答える
1

参照されている例では、一度に 1 つのポートのみをアクティブにリッスンします。推奨される解決策は、4 つのハードウェア シリアル ポートを備えた Arduino Mega (https://www.sparkfun.com/products/11061) にアップグレードすることです。

2 つのソフトウェア シリアル ポートを同時にサポートするには、多くの CPU リソースが必要になります。また、設計が難しく、プログラミングに時間がかかりすぎて、58 ドル + 送料のコストをはるかに上回っています。

あなたのコードをもう一度見ると、portOne.listen コマンドの直後に文字をチェックしていることに気付きます。9600 ボーでは、最初の文字が到着するまでに約 1 ミリ秒かかります。while テストは完了し、最初の文字が到着するずっと前に portTwo.listen コマンドが実行されます。

テスト目的で、portOne.listen コマンドの後に 1 ~ 2 ミリ秒の遅延を追加して、文字が表示されるかどうかを確認してください。

例として (ポート 1 が文字間ギャップなしで文字を送信している場合、最初の while が失敗することはなく、ポート 2 の文字を読み取ることができないことに注意してください):

void loop()
{

    portOne.listen();
    delay(2);
    while (portOne.available() > 0) {
        char inByte = portOne.read();
        Serial.write(inByte);
        delay(1);
    }

    portTwo.listen();
    delay(2);
    while (portTwo.available() > 0) {
        char inByte = portTwo.read();
        Serial.write(inByte);
        delay(1);
    }
    Serial.println();
}
于 2012-09-18T01:26:59.270 に答える