2

我正在尝试通过 Arduino pro mini 配置我的 XBee 模块,该 Arduino pro mini 通过 sparkfun 的 de FTDI basic 连接到我的计算机。我已经可以通过 Arduino 将数据从 Xbee 写入和发送到另一个 Xbee 模块。我的问题是我想通过 arduino 配置 Xbee。我正在使用 arduino 向我的 Xbee 发送“+++”,并希望通过 arduino 编辑器的串行监视器从 Xbee 接收“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

这是一个愚蠢的答案,但首先,您应该检查您的 Xbee 是否配置为 AT 设备而不是 API 设备。如果是 API 模式,模块将无法理解消息。

为此,您只需使用 X-CTU 应用程序并读取模块的配置,并将其更改为 AT 设备。

希望有帮助。

于 2013-12-10T12:12:37.767 回答
0

您必须在发送 +++ 命令后立即从串口读取,因为这是 xbee 写入“OK”的地方。尊重守卫时间的更好方法是等待回复,然后测试它是否“OK”。

这是我的代码,我不记得上次检查时它是否正常工作,但我将其粘贴在这里,您可以随意修改它。它所做的只是广播 A1、B2、C3 等。

有很多评论指出我正在试验的地方,但常规评论提供了丰富的信息。确保您逐步完成它,当您了解它时,它非常简单。如果要广播,不要忘记将目标地址低更改为 0xFFFF。

最后你会得到和我一样的认识,AT模式不适合通过编写程序来配置xbee。

例如,我有一个 xbee 不断发送数字“2”,当另一个 xbee 使用此代码进入命令模式时,它会从远程 xbee 接收数字 2,而它应该收到来自本地 xbee 的“OK”消息,因此程序不承认它处于命令模式并中断。进入命令模式时,您会认为 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 回答
0

感谢您的回复和帮助,也很抱歉回复晚了。

我已经解决了这个问题。问题是函数 write()。如果你想从 XBee 进入命令模式,你应该只发送“+++”。如果“+++”后面有某种字符,则无法访问命令行。函数 write 把一个(对我来说)未知字符放在“+++”后面。所以这就是没有到达命令行的问题。

要解决这个问题,只需使用函数 print("+++")。使用此功能后,可以访问命令行。

于 2014-01-13T13:35:32.570 回答