2013-10-18 57 views
2

我想通过一个Arduino pro mini配置我的XBee模块,该模块通过sparkfun的de FTDI basic连接到我的电脑。 我已经可以将数据从Xbee编写并发送到Arduino的另一个Xbee模块。 我的问题是我想通过arduino配置Xbee。我将arduino的'+++'发送给我的Xbee,并希望通过Arduino编辑器的串行监视器从Xbee接收'OK'。问题是,我可以发送它,但从来没有收到和'确定',并且当我试图配置Xbee时,配置从未发生过。所以我不能到达Xbee命令行。通过Arduino mini pro初始化Xbee S1

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; 

}

提前感谢!

回答

0

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

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

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

0

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

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

希望有所帮助。

0

发送+++命令后,您必须从串行读取权限,因为这是xbee写入'OK'的地方。尊重守卫时间的更好方法是等待答复,然后测试以确定它是否“正常”。

这是我的代码,我不记得它是否在最后一次检查时工作,但我只是将它粘贴到此处,并且可以随意修改它。它所做的全部是广播A1,B2,C3等。

有很多评论我在试验的地方,但常规评论是信息性的。确保你一步一步地完成它,这很简单。如果您想广播,请不要忘记将目标地址更改为0xFFFF。

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

例如,我有一个xbee在不停地发送数字'2',并且当另一个xbee使用此代码进入命令模式时,它应该收到'OK'消息时从远程xbee收到数字2来自本地的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); 
}