web-dev-qa-db-ja.com

シリアルArduinoおよびXBeeを介したデータの読み取り

私は以下を持っています:

2つ Arduinos および2つ XBees 。あるデータから別のデータを送信したい。私は提案テストを行っているので、XBeesは通信します(一方のXBeeをArduinoに接続し、もう一方をPCに接続し、一方から書き込み、もう一方をもう一方の端末で監視します)。

今、私はあるものから別のものにデータを送りたいです:

これらは私の2つのスクリプトです:

送信の場合(すべての文字を送信する前のテストでテストされます):

_#include <SoftwareSerial.h>

SoftwareSerial xbee(2, 3); // RX, TX
char c = 'A';
int  pingPong = 1;

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

    Serial.println( "Arduino started sending bytes via XBee" );

    //Set the data rate for the SoftwareSerial port
    xbee.begin(9600);
}

void loop() {
    // Send character via XBee to other XBee connected to Mac
    // via USB cable.
    xbee.write( c );

    //--- Display the character just sent on console. ---
    Serial.println( c );

    //--- Get the next letter in the alphabet, and reset to ---
    //--- 'A' once we have reached 'Z'.
    c = c + 1;
    if ( c>'Z' )
         c = 'A';

    //--- Switch LED on Arduino board for every character sent---
    if ( pingPong == 0 )
        digitalWrite(13, LOW);
    else
        digitalWrite(13, HIGH);
    pingPong = 1 - pingPong;
    delay( 1000 );
}
_

問題は、他のXBeeからデータを受信するためにArduinoを接続したときです。

これが私のコードです:

_#include <SoftwareSerial.h>

SoftwareSerial xbee(2, 3); // RX, TX

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

    Serial.println( "Arduino started receiving bytes via XBee" );

    // Set the data rate for the SoftwareSerial port.
    xbee.begin(9600);
}

void loop()  {
    int temp = xbee.read();

    Serial.print("Character received:");
    Serial.println(temp);
    delay(1000);
}
_

出力は常に:

_Character received: -1.
_

tempintからbyteに変更すると、Character received: (a non-[ASCII][3] symbol)が表示されます。

XBeeシリーズ1を使用しています。

これらは、ladyada.netにある1つのチュートリアルに基づいて、X-CTUを介して構成されます。

次に、XBeeをArduinoに接続し(TXをピン3に、RXを2に、VccとGNDにそれぞれ)、もう1つのXBeeを [〜#〜] ftdi [〜#〜] を介してPCに接続しました。ケーブル。 Arduinoからキャラクターを送って、X-CTUのシリアルモニターで見ることができました。これは、それらが正しく構成されていることを意味しますか?

次に、Arduinoをレシーバーに接続したいと思いました。上記のコードを見ることができます。私は常に利用可能なデータを取得していません。

-1が返されるということは、シリアルにデータがないことを意味します。

6
ghostrider

intbyteに変更すると、実際にはintがcharに変更されます。非- [〜#〜] ascii [〜#〜] 記号は、文字(_0b11111111_)をレンダリングしようとした結果です。 intはデフォルトで署名されているため、10進数の負の1(_-1_)はすべて2進数の1です。 Bin/Dec/Hex Converter をチェックして確認してください。

つまり、xbee.read()byte/charを返します。 ドキュメント で何も見つかりませんでしたが、_-1_はエラーによるものと思われます(ハードウェアSerialドキュメントに基づく) )。これは、読むものがないためです。

次のことを試すことができます。

  • RX/TXラインが正しいことを確認してください。私を信じてください、それは起こります。
  • 読み取る前に、XBeeに利用可能なデータがあるかどうかを確認してください。 (バイトを読み取る準備ができるまで待機するため、印刷される行が大幅に少なくなります。)
_if (xbee.available()) {
    byte temp= xbee.read();
    Serial.print(temp);
}
_
  • 内蔵(ハードウェア)を使用してください。 SoftwareSerialは機能するはずですが、私の経験では、ハードウェアシリアルの方がはるかに信頼性があります。
    • Arduinoのモデルによっては、( シリアル接続での自動リセットを無効にする )が必要になる場合があります。これは、IDEシリアルモニター(一般的に言えば)以外の場所からFTDIチップを介してデータを送信しようとしている場合にのみ必要と思われます。
  • このスレッドArduinoからArduino XBeeシリアル通信は、動作しているように見える非常によく似たセットアップを持っています。作業を可能な限り簡素化してから、ゆっくりと機能を追加してください。
  • XBee RX&TXラインをUSB-FTDIコネクタ( このケーブル またはこれ ブレークアウトボード など)に直接接続します。

実用的な概念実証ができるまでは、できるだけ単純にする必要があります。動作したら、機能を1つずつ追加します。これはすでに行っていることのように見えますが、おそらくさらに単純化することができます(FTDIのみを使用するか、ハードウェアシリアルを使用するなどして、Arduinoを方程式から除外します)。

それはかなりクールなプロジェクトのように聞こえます。幸運を!

6
ZnArK
void loop()  {
    unsigned char temp; = 
    if (Serial.available() > 0){
       temp = xbee.read();
       Serial.print("Character received:");
       Serial.println(temp,HEX);
}

このコードを試してください。
MSBを処理するために、inttempをunsignedcharに変換しました。わたしにはできる。しかし、私はXbeeシリーズ2とハードウェアシリアルを使用しました。とにかく、データ処理は重要です。

0
Satheesh Kumar