2

sparkfunのde FTDI basicでコンピューターに接続されているArduino pro miniでXBeeモジュールを構成しようとしています。Arduino を使用して、Xbee から別の Xbee モジュールにデータを書き込んで送信することができます。私の問題は、arduino で Xbee を構成したいということです。arduino で '+++' を Xbee に送信していますが、arduino エディタのシリアル モニタで Xbee から 'OK' を受信したいと考えています。問題は、送信はできるが、受信して「OK」することはなく、Xbee を構成しようとしても構成が行われないことです。そのため、Xbee コマンド ラインにアクセスできません。

    uint8_t pinRx = 0, pinTx = 1; //Initialise pins on the Arduino
    char GotChar;
    long BaudRate = 4800;
    int incomingByte=0;
    SoftwareSerial mySerial( pinRx , pinTx );  //Initialise SoftwareSerial
    
    void init_USB()
    {
      Serial.begin(BaudRate);    
      Serial.println("Start");   
      mySerial.begin(BaudRate);  
    }
    
    void init_XBee()
    {
      Serial.begin(9600);
      int check = 0;
      while(T_XBEE_CONTROLLER_CheckOK() == 0)
      {
        Serial.println("CheckOK");
        Serial.write("+++");
        delay(2000);
      }
      Serial.println("ATCH 8\r");
      delay(2000);
      Serial.write("ATID 1234\r");
      delay(2000);
      Serial.write("+++");
      delay(2000);
      Serial.write("ATPL 0\r");
      delay(2000);
      
      Serial.write("+++");
      delay(2000);
      Serial.write("ATAP 2\r");
      delay(2000);
    }

    int T_XBEE_CONTROLLER_CheckOK()
    {
            char ch[2];
            ch[0] = 0x00;
        while(! ((ch[0] == 'O' ) && (ch[1] == 'K')  ))
        {
                ch[0] = mySerial.read();
                ch[1] = mySerial.read();
                if((ch[0] != 'O') && (ch[1] != 'K') && (ch[2] != '\r'))
                {
                  Serial.println("FAILED");
                        return 0;
                }
                Serial.println("SUCCES");
                return 1;
        }
        return 0;
}
4

3 に答える 3

0

返信とヘルプをありがとう、また返信が遅くなって申し訳ありません。

私はすでに問題を解決しました。問題は関数 write() でした。XBee からコマンド モードに到達したい場合は、"+++" のみを送信する必要があります。「+++」の後ろに何らかの文字があると、コマンドラインに到達できません。関数 write は、(私にとっては) 不明な文字を "+++" の後ろに置きます。これが、コマンド ラインにアクセスできないという問題です。

この問題を解決するには、関数 print("+++") を使用します。この関数を使用すると、コマンド ラインにアクセスできます。

于 2014-01-13T13:35:32.570 に答える
0

ばかげた答えですが、まず、Xbee が API デバイスではなく AT デバイスとして構成されていることを確認する必要があります。API モードの場合、モジュールはメッセージを理解できません。

これを行うには、X-CTU アプリケーションを使用してモジュールの構成を読み取り、それを AT デバイスに変更するだけです。

それが役立つことを願っています。

于 2013-12-10T12:12:37.767 に答える
0

+++ コマンドを送信した直後にシリアルから読み取る必要があります。これは、xbee が「OK」を書き込む場所だからです。また、ガード タイムを尊重するより良い方法は、応答を待って、それが「OK」かどうかをテストすることです。

これが私のコードです。最後にチェックしたときに機能していたかどうかは覚えていませんが、ここに貼り付けるだけで、好きなように変更できます。A1、B2、C3 などをブロードキャストするだけです。

私が実験していたところにはコメントアウトがたくさんありますが、通常のコメントは参考になります。手順を追って確認してください。頭をつかめば非常に簡単です。ブロードキャストする場合は、送信先アドレスを 0xFFFF に変更することを忘れないでください。

最後に、AT モードはプログラムを作成して xbee を構成するのに適していないという私と同じ認識に達するでしょう。

たとえば、私は常に番号「2」を送信するxbeeを持っていました。別のxbeeがこのコードを使用してコマンドモードに入ると、ローカルxbeeから「OK」メッセージを受信する必要があるときに、リモートxbeeから番号2を受信します、したがって、プログラムはそれがコマンドモードであり、壊れていることを認識しませんでした。コマンド モードに入ると、xbee が受信機をオフにすると思うかもしれませんが、そうではないため、簡単に問題が発生する可能性があります。

正しい方法で行いたい場合は、API モードをご覧ください。私はシリーズ 1 の xbee を持っているので、Digimesh プロトコルを実装しています。これまでオンラインで実行している人を見たことがありませんが、Zigbee とほとんど同じなので簡単です。必要に応じて、簡単な例として役立つコードを提供できます。

    /*
      unicast_configure
     Configure an XBee for unicast transmission and transmit
     some characters to test
     */
    
    #include <SoftwareSerial.h>
    
    // Pins on Bees Shield:
    SoftwareSerial xbee(2, 3);  // TX, RX
     
    boolean configured;
    char c = 'A';
    
    boolean configureRadio() {
      
       // Set the data rate for the SoftwareSerial port:
       xbee.begin(9600);
       
      // Put the radio in command mode:
      Serial.write("Entering command mode\r");
      delay(1000);
      while(xbee.available()>0) {xbee.read();}
      xbee.write("+++");
      while(xbee.available()>0) {xbee.read();}
      //delay(1000);
      //while(xbee.available() > 0) {Serial.write(xbee.read());}
      
      String ok_response = "OK\r"; // The response we expect
      
      // Read the text of the response into the response variable
      // This satisfies the guard time by waiting for the OK message
      String response = String("");
      while (response.length() < ok_response.length()) {
        if (xbee.available() > 0) {
          response += (char) xbee.read();
        }
      }
      Serial.println("response1: " + response);
      
      // If we got received OK, configure the XBee and return true:
      if (response.equals(ok_response)) {
        Serial.println("Enter command mode successful");
        
        // Restore to default values:
        Serial.println("Restoring default values before making changes");
        xbee.write("ATRE\r");
        Serial.println("Setting addr high");
        xbee.write("ATDH0\r");  // Destination high
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.println("Setting addr low");
        xbee.write("ATDL1\r");  // Destination low-REPLACE THIS
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.println("Setting MY address");
        xbee.write("ATMYFFFF\r");
        
        // Apply changes:
        Serial.println("Applying changes");
        xbee.write("ATAC\r");
    /*    
        ///////////////////////////////////////////////
        // Write to non-volatile memory:
        // Use similar technique as above to satisfy guard time
        Serial.write("Saving\r");
        xbee.write("ATWR\r");
        String response2 = String("");
        //while (xbee.available() > 0) {Serial.write(xbee.read());}
        while (response2.length() < ok_response.length()) {
          if (xbee.available() > 0) {
            response2 += (char) xbee.read();
          }
        }
        Serial.println("response2: " + response2);
        
        if (response2.equals(ok_response)) {
          Serial.println("Save successful");
        }
        else { Serial.println("Save not successful");
               return false;
        }
        
        // And reset module:
        Serial.println("Resetting");
        xbee.write("ATFR\r");
        ///////////////////////////////////////////////
        
    */
        Serial.write("Exit command mode\r");
        xbee.write("ATCN\r");  // Exit command mode
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.write("Finished\r");
        return true;
      } else {
        return false; // This indicates the response was incorrect
      }
    }
        
    void setup() {
      Serial.begin(9600);  // Begin serial
      configured = configureRadio();
    }
    
    void loop() {
      // Test transmission:
      if (configured) {
        xbee.print(c);
        Serial.print(c);
        c = c + 1;
        if (c > 'Z') { c = 'A'; }
      }
      else {
        Serial.println("Not configured (in loop)");
        delay(5000);
        Serial.println("Retrying configuration");
        configured = configureRadio();
      }
      
      delay(1500);
    }
于 2013-12-12T03:41:06.560 に答える