An XBee Series 2 is set to Router AT
whose TX
and RX
pins are connected to an Arduino Nano's Rx
and Tx
pins respectively. The Arduino is connected to a Mac OSX via USB.
A second XBee Series 2 is connected to a Windows system via USB. It is set to Coordinator API
mode.
Using the sketch below on the Arduino, a packet is sent from the Router AT
XBee to the Coordinator API
XBee, which is seen by XCTU
as a Explicit RX frame. However the Arduino LED should blink once if it received a reply packet (should it?)
On another test, I wrote a script to send a frame for the Coordinator API
XBee to send to the Router AT
XBee. Once again the Arduino LED does not blink, and nothing is seen using Arduino's Serial Monitor.
Testing the Coordinator API
XBee
Using the same script to send a packet from Coordinator API
XBee to itself, the packet was received as well as a delivery confirmation packet. This shows that both the Coordinator API
XBee and the script are working.
// Delivery confirmation
received: { type: 144,
remote64: '0013a20040a74613',
remote16: '0000',
receiveOptions: 1,
data: [ 116 ] }
// Received the packet sent to itself
received: { type: 139,
id: 1,
remote16: '0000',
transmitRetryCount: 0,
deliveryStatus: 0,
discoveryStatus: 0 }
Testing the Arduino Sketch Code
Using the same Arduino sketch which continuously sends API frames to the Coordinator
, I connected the Router AT
XBee's RX
pin to Arduino's RX
pin, so the frames the Arduino are sending out are going back into its RX
pin.
This causes the Arduino's LED to light up! So there is nothing wrong with the code.
Problem: Does this mean the Router AT
XBee is not configured properly? I do not think its TX
pin is damaged because XCTU
can still read the settings off this XBee. Any ideas on how we can troubleshoot this?
Arduino Sketch (Connected to Router Xbee)
#include <XBee.h>
XBee xbee = XBee();
uint8_t payload[] = { 0, 0 };
// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x40a74613);
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
xbee.setSerial(Serial);
}
void loop() {
xbee.send(zbTx);
delay(1000);
xbee.readPacket();
if (xbee.getResponse().isAvailable()) {
// Response received, blink LED once
Serial.println('resposne!');
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
}
2 Answers 2
As I mentioned in my comments to your question, if you are using this library
then it doesn't actually support AT mode. In fact, AT mode (otherwise known as Transparent Mode) is simply attached to the Serial
port and accessed directly through the Serial
object.
Example: put this into your Arduino attached to the AT Router.
#define LED 13
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial.println("\nXBee AT communications test");
}
void loop() {
static unsigned long previous = millis()/1000;
if(previous != millis()/1000){
previous = millis()/1000;
char buffer[5];
sprintf(buffer,"%04i",previous);
Serial.println(buffer);
digitalWrite(LED, !digitalRead(LED));
}
}
Then open the console on the XCTU software on the API Coordinator watch the packets.
look at packet 0102
You will see above the received packets from the router. Because the coordinator is in API
mode, you see it like this. (In AT
mode, you will see the raw packets.
Ichose numbers to send because they are easy to read in this form. Packet 0102
appears in the packets data as 30 31 30 32 0D 0A
In AT
mode there is no packet confirmation, validations, status or anything. They are all handled "transparently".
As a side note, I've seen many references that both XBees need to be in the same mode. That is, in fact, incorrect. If we modify our source to include Serial.read
you would see data the other way as well.
edit: I thought I would add communications between AT Router
and API Coordinator
. I have modified the code in the Router
to receive a constructed packet from the Coordinator
via the XCTU software.
#define LED 13
boolean serialComplete = false;
char bufferIn[64];
char bufferOut[5];
int count=0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
Serial.println("\nXBee AT communications test");
}
void loop() {
static unsigned long previous = millis()/1000;
if(serialComplete) {
Serial.println(bufferIn);
serialComplete=false;
count = 0;
memset(bufferIn,0,sizeof(bufferIn));
digitalWrite(LED,!digitalRead(LED));
}
if(previous != millis()/1000){
previous = millis()/1000;
sprintf(bufferOut,"%04u",(uint16_t)previous);
Serial.println(bufferOut);
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n' || inChar == '0円') {
bufferIn[count++]=0;
serialComplete = true;
} else {
bufferIn[count++] = inChar;
}
}
}
Then in XCTU construct a packet for the Coordinator
. I'm using version 6.1.0.
add API frame
and click "the create frame using form generator tool"
form generator tool
here is the packet being received by the router. I am only sending 9999
nul
terminated.
result
Then once the pair are running, you can send the constructed packet from the XCTU software and it will be received by the router.
#include <XBee.h>
uint8_t text[] = {'H', 'e', 'l', 'l', 'o',' ','T','H','I','S',' ','I','S',' ', 'A','R','D','U','I','N','O'};
XBee xbee = XBee();
XBeeAddress64 remoteAddress = XBeeAddress64(0x00000000, 0x0000FFFF);//64 address of remote xbee:
ZBTxRequest zbTx = ZBTxRequest(remoteAddress, text, sizeof(text));// api 2 Tx request frame
ZBRxResponse zbRx = ZBRxResponse();// reading remote xbee response:
void setup()
{
Serial.begin(9600);
xbee.setSerial(Serial);
Serial.println("starting up yo!");
}
void loop ()
{
xbee.readPacket();// This will read any data that is available:
if (xbee.getResponse().isAvailable())//Now, to check if a packet was received:
{
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
xbee.send(zbTx);//sending data to remote xbee:
}
}
}
Explore related questions
See similar questions with these tags.
Router AT
packet to theCoordinator
inAPI
mode. Sending out via AT is aSerial.print("sample");
. Whereas the sketch you have above only shows us the Coordinator's outwards bound packet. Does that library handleAT
mode as well? And what about addresses? You don't need to explicitly set the address outwards of the Coordinator (although it wouldn't hurt), the Coordinator should/can broadcast it's message. Can you confirm theATDL
of the Router is0x0
or0xFFFF
if ATDH is0x0
.ATAP=2
so that's something else to check.Router AT
Xbee, notCoordinator
XBee. Made the change in the question