2014-02-27 61 views
1

我打算在中断处理程序中读取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(); 
} 

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

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

回答

0

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

我最后的设计是保留串口的字节缓冲区,并在我的主事件循环中调用的“tick”函数中解析/调度帧。在一个应用程序中,我每50ms至少调用一次“tick”函数(IIRC)。至于强制XBee模块缓冲你睡觉时的串行数据,我想你会遇到困难。您需要取消确认RTS,但随后请等待XBee是否仍在向您发送一个字节。我记得在取消确认RTS之后,我仍然会得到多个字节(3或4?)。在醒着的时候,你还必须处理获取部分数据包的条件,并且需要决定是否能够接收整个帧,或者下一次醒来。

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

相关问题