1

現在、GPS モジュール、デジタル コンパス、ZigBee ( XBeeモデム) を Arduino に接続するプロジェクトを行っています。ところで、私はEclipse IDE を使用してこのプロジェクトを実行しているので、コードをいくつかのライブラリに分割しました。

XBee は現在、ハードウェアUARTを使用しており、正常に動作しています。GPS モジュールとデジタル コンパスはどちらもソフトウェア シリアルを使用しています。

私の問題は、両方のソフトウェア シリアルをインスタンス化すると、最新のものしか機能しないことです。

以下は私のサンプルコードです。

void CSensor::initSensors()
{
    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);

    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);
}

gpsSerialCSensorクラスのポインターメンバーとして宣言されています。-> SoftwareSerial* gpsSerial; compassSerialも同じように宣言されています - >SoftwareSerial* compassSerial;

上記のサンプル コードでは、デジタル コンパスのみが動作し、GPS は動作しません。しかし、コードの位置を入れ替えると、次のようになります。

void CSensor::initSensors()
{
    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);

    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);
}

GPS は機能しますが、デジタル コンパスは機能しません。ソフトウェアシリアルに問題があると思います。解決策は何ですか?

4

5 に答える 5

2

1 つの質問: プロジェクトに Arduino Mega を使用することを検討しましたか? このボードを使用すると、4 つの (実際の) ハードウェア UART が得られます。目的には十分なはずです。

「ソフトウェア シリアル」ライブラリを使用するのは、あまりにもトリッキーです。場合によっては正常に動作することもありますが、通常のシリアル ポートと比較すると重要な制限があり、データ損失を引き起こす可能性が非常に高くなります。

複数のシリアル デバイスを管理する場合、「シリアル エミュレーション」に時間を費やすことはお勧めしません。より優れたマイクロコントローラーを使用するだけで、それだけです。

于 2012-11-16T11:18:02.483 に答える
1

SoftwareSerialは問題ありません。jdhが言ったように、Arduinoは一度に1つのソフトウェアシリアルしか読み取ることができません。ただし、Sparkfun GPSを使用している場合は、実際にUART for GPSを使用できます(UART / Dlineスイッチを使用し、RX / TXピン番号をそれぞれ2、3から0、1に変更します)。

このためには、スイッチをdlineのままにして、コードをアップロードします。この後、ArduinoがGPSから読み取れるように、UARTに戻します。これは問題なく動作します。

詳細については、GPSチュートリアルのUARTセクションを確認してください。 http://www.sparkfun.com/tutorials/173

于 2012-08-06T12:59:44.730 に答える
1

Ardiunoのドキュメントによると:

ライブラリには次の既知の制限があります。

複数のソフトウェア シリアル ポートを使用している場合、一度にデータを受信できるのは 1 つだけです。

そのため、各ソフトウェア シリアルからのサンプリングを切り替えるコードを追加する必要があるようです。GPS ブロードキャストが 2 番目の間隔で送信されていることを知っています。そのため、有効な GPS 読み取りを取得した後、それを切断し、次のスケジュールされた GPS までコンパスを監視します。研究課題は、物事を初期化し、コードを十分に効率的に保つのにどれくらいの時間がかかるかということです.

于 2012-06-14T14:51:58.480 に答える
0

使用する SoftwareSerial ポートをリッスンするように設定するには

mySerial.listen()

これは、設定後にメッセージが到着するのを待たなければならないことを意味しますlisten()。チェックすることでこれを行いますmySerial.available()>0

欠点は、他のデバイスからのメッセージを見逃すことです。そのため、優れたプログラム設計が非常に重要になります。しかし、私はあなたがそれを知っていると確信しています:)

于 2012-10-25T00:12:50.520 に答える