通过Arduino mini pro初始化Xbee S1

时间:2013-10-18 09:43:52

标签: arduino xbee ftdi

我正在尝试通过来自sparkfun的de FTDI basic连接到我的计算机的Arduino pro mini来配置我的XBee模块。 我已经可以通过Arduino将数据从Xbee写入并发送到另一个Xbee模块。 我的问题是我想通过arduino配置Xbee。我正在向我的Xbee发送带有arduino的'+++',并希望通过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;

}

提前致谢!

3 个答案:

答案 0 :(得分:0)

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

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

希望有所帮助。

答案 1 :(得分:0)

您必须在发送+++命令后立即从串行中读取,因为这是xbee写入“OK”的地方。另外一个更好的方法来尊重保护时间是等待回复,并测试它是否'OK'。

这是我的代码,我不记得它是否在我最后一次检查时工作但我只是将其粘贴到此处,您可以根据需要进行修改。所有这一切都是广播A1,B2,C3等。

有很多评论我在试验的地方,但定期的评论是提供信息的。确保你一步一步地完成它,当你绕过它时它很简单。如果要广播,请不要忘记将目标地址更改为0xFFFF。

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

例如,我有一个xbee不断传输数字'2',当另一个xbee使用此代码进入命令模式时,它将从远程xbee收到数字2,当它应该收到来自的'OK'消息时本地xbee,因此程序没有确认它处于命令模式和中断。当进入命令模式时,你会认为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);
}

答案 2 :(得分:0)

感谢您的回复和帮助,也对迟到的回复感到抱歉。

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

要解决此问题,只需使用函数print(“+++”)。使用此功能后,可以到达命令行。