我打算在中断处理程序中读取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 :(得分:0)
当我设计这个ANSI C XBee Host library时,我想我可以将帧处理作为飞思卡尔HCS08平台上串行中断处理程序的一部分。我发现它只是运行不正常,特别是波特率为115,200。
我使用的最终设计是保留串口的字节缓冲区,并在我的主事件循环中调用的“tick”函数中解析/分派帧。在一个应用程序中,我每50ms(IIRC)至少调用一次“tick”功能。
至于迫使XBee模块在你睡觉时缓冲串行数据,我想你会很难。你需要取消断言RTS,然后等待看看XBee是否还在向你发送一个字节。我的回忆是,在取消断言RTS后,我仍然会得到多个字节(3或4?)。你还需要在清醒时处理获得部分数据包的情况,并且需要决定你是否会接收整个帧,或者下次你醒来时。
使用XBee模块的SPI接口可能会更好,因为主机控制何时发送字节,甚至可能让XBee在有字节要发送时在主机上触发硬件中断。您也可以使用高速(460kbps及以上,我相信)来快速获取字节。