2013-10-18 58 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); 
}