【问题标题】:Initializing Xbee S1 by an Arduino mini pro用 Arduino mini pro 初始化 Xbee S1
【发布时间】:2013-10-27 02:36:45
【问题描述】:

我正在尝试通过 Arduino pro mini 配置我的 XBee 模块,该 Arduino pro mini 通过 sparkfun 的 de FTDI basic 连接到我的计算机。 我已经可以通过 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;
}

【问题讨论】:

    标签: arduino xbee ftdi


    【解决方案1】:

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

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        最后你会发现和我一样,AT模式不适合通过编写程序来配置xbee。

        例如,我有一个 xbee 不断发送数字“2”,当另一个 xbee 使用此代码进入命令模式时,它会从远程 xbee 收到数字 2,而它应该收到来自远程 xbee 的“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);
            }
        

        【讨论】:

          猜你喜欢
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 2016-07-17
          • 2017-04-18
          • 1970-01-01
          • 2022-01-15
          • 2013-08-14
          相关资源
          最近更新 更多