xbee:从中断接收消息

时间:2014-02-27 15:35:57

标签: arduino xbee

我打算在中断处理程序中读取xbee收到的数据。

但由于处理程序无法使用延迟,我无法使用readPacket (100)

我有以下代码:

#include <XBee.h>
#include <avr/power.h>
#include <avr/sleep.h>

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();

int size;
uint8_t buffer[256];


void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  xbee.begin(Serial1);
  attachInterrupt(0, wake_up_now, LOW  );
}

void wake_up_now() { 
  xbee.readPacket();
  if(xbee.getResponse().isAvailable()){
    if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
      xbee.getResponse().getZBRxResponse(rx);
      size = rx.getDataLength();
      for (int i = 0; i < size; i++)  
       buffer[i] = rx.getData(i); 
    }
  }
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_IDLE);  

  sleep_enable();          
  power_adc_disable();
  power_spi_disable();
  power_timer0_disable();
  power_timer1_disable();
  power_timer2_disable();
  power_twi_disable();

  sleep_mode();  

  sleep_disable();         
  power_all_enable();
}


void loop() {
  Serial.print("Awake");

  Serial.println(size);
  for (int i = 0; i < size; i++)  
       Serial.println(buffer[i]); 

  Serial.println("Entering Sleep mode");
  delay(100);    
  sleepNow();   
}

如果您第一次收到数据我无法读取此数据。 但稍后,当收到更多数据时,将读取第一条消息中发送的数据。

我真的需要读取处理程序中的数据,我该如何解决?

1 个答案:

答案 0 :(得分:0)

当我设计这个ANSI C XBee Host library时,我想我可以将帧处理作为飞思卡尔HCS08平台上串行中断处理程序的一部分。我发现它只是运行不正常,特别是波特率为115,200。

我使用的最终设计是保留串口的字节缓冲区,并在我的主事件循环中调用的“tick”函数中解析/分派帧。在一个应用程序中,我每50ms(IIRC)至少调用一次“tick”功能。

至于迫使XBee模块在你睡觉时缓冲串行数据,我想你会很难。你需要取消断言RTS,然后等待看看XBee是否还在向你发送一个字节。我的回忆是,在取消断言RTS后,我仍然会得到多个字节(3或4?)。你还需要在清醒时处理获得部分数据包的情况,并且需要决定你是否会接收整个帧,或者下次你醒来时。

使用XBee模块的SPI接口可能会更好,因为主机控制何时发送字节,甚至可能让XBee在有字节要发送时在主机上触发硬件中断。您也可以使用高速(460kbps及以上,我相信)来快速获取字节。