2014-02-27 55 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以上,我相信)快速獲取字節。

相關問題