Трябва да прочетете от серийния номер веднага след като изпратите командата +++, защото това е мястото, където xbee пише 'OK'. Също така по-добър начин да спазвате времето за охрана е да изчакате отговор и да тествате дали е „ОК“.
Ето моя код, не помня дали работеше последния път, когато проверих, но просто ще го поставя тук и вие можете да го промените както искате. Всичко, което прави, е излъчване на A1, B2, C3 и т.н.
Има много коментари там, където експериментирах, но редовните коментари са информативни. Уверете се, че преминавате през него стъпка по стъпка, това е доста просто, когато разберете какво мислите. Не забравяйте да промените адреса на дестинация low на 0xFFFF, ако искате да излъчвате.
В крайна сметка ще стигнете до същото разбиране, което направих аз, че AT режимът не е подходящ за конфигуриране на xbee чрез писане на програми.
Например имах едно xbee, което постоянно предаваше числото „2“, и когато друго 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);
}
person
jigglypuff
schedule
12.12.2013