Ayuda del modo API de XBee

1

No estoy seguro de que este sea el lugar adecuado para formular esta pregunta, pero si alguien está familiarizado con XBee y puede ayudarme con este problema, aprecio mucho su ayuda.

Tengo dos XBees, uno configurado como API coordinador y otro configurado como enrutador API.

He adjuntado esos dos XBees con dos arduinos solo para probar la comunicación entre ellos. El código para cada uno es muy simple.

Código en arduino conectado al coordinador XBee

Descripción: Esto simplemente presionará el botón presionando. Al presionarlo se enviará el cuadro de solicitud de transmisión ZigBee.

int BUTTON1 = 3;

void setup()
{
    pinMode(BUTTON1, INPUT);
    Serial.begin(9600);
}

void loop()
{
    if (digitalRead(BUTTON1) == HIGH)
    {
        sendData();
    }
}

void sendData()
{
    Serial.write(0x7E);

    Serial.write(0x00);
    Serial.write(0x16);

    Serial.write(0x10);

    Serial.write(0x01);


    Serial.write(0x00);
    Serial.write(0x13);
    Serial.write(0xA2);
    Serial.write(0x00);
    Serial.write(0x40);
    Serial.write(0x8C);
    Serial.write(0xC6);
    Serial.write(0xD4);

    Serial.write(0x20);
    Serial.write(0x01);

    Serial.write(0x00);

    Serial.write(0x00);

    //data start  
    Serial.write(0x54);
    Serial.write(0x78);
    Serial.write(0x44);
    Serial.write(0x61);
    Serial.write(0x74);
    Serial.write(0x61);
    Serial.write(0x30);
    Serial.write(0x41);

    Serial.write(0x13);

    delay(10);

}

El siguiente es el código para arduino conectado al enrutador XBee.

Descripción: Esto simplemente escanea el byte "0x54" y, si está allí, se enciende un LED. Como puede ver, el coordinador envía este byte 0x54 junto con otros bytes.

int BELL = 5;

void setup()
{
    pinMode(BELL, OUTPUT);
    Serial.begin(9600);
}

void loop()
{

    if(Serial.available() >= 25)
    {
        if(Serial.read() == 0x7E)
        {
            for(int i=0;i<24;i++)
            {
                if(Serial.read() == 0x54)
                {
                    digitalWrite(BELL, HIGH); 
                }
            }
        }
    }
}

Me gustaría agregar que, cuando enciendo el monitor de serie, y luego presiono el botón, el monitor de serie muestra correctamente qué datos se pasaron. También se enciende el tx. Así que mi suposición es que el problema está en que el enrutador no obtiene los datos, en lugar de que el coordinador no los envíe. He estado tratando de resolver este problema durante un par de horas sin éxito. Cualquier ayuda es muy apreciada!

    
pregunta user734861

1 respuesta

1

No creo que tu byte de suma de comprobación sea correcto.

Sumando todos los bytes de después de los bytes de longitud a antes de que el byte de suma de comprobación me dé 0x604. 0xff - 0x04 = 0xfb

Debería escribir un método para implementar el envío (y la recepción también), por ejemplo,

struct xBeePacket {
   unsigned int dest_address;
   unsigned char api_id;
   unsigned char frame_id;
   unsigned char options;
   unsigned char data[100];
   unsigned int length;
}

void send_message(xBeePacket* p)
{
   unsigned char checksum = 0;

   Serial.write(0x7E);
   Serial.write((byte)(length>>8));
   Serial.write((byte)(length & 0x00ff));

   Serial.write(p->api_id);  checksum += p->api_id;
   Serial.write(p->frame_id);  checksum += p->frame_id;

   Serial.write((byte)(p->dest_address >> 8));  
   checksum += (byte)(p->dest_address >> 8);
   Serial.write((byte)(p->dest_address & 0x00ff));  
   checksum += (byte)(p->dest_address & 0x00ff);

   Serial.write(p->options);  checksum += p->options;

   for (int i = 0; i < p->length; i++)
   {
       Serial.write(p->data[i]);  checksum += p->frame_id;
   }

   Serial.write(0xff - checksum);
}

Hoep esto te ayuda a empezar.

    
respondido por el geometrikal

Lea otras preguntas en las etiquetas