接上篇TinyOS·基本发送来写这篇TinyOS的基本接收。
- 1、头文件,申明要用到的头文件、常量,定义数据包的格式等
// msg.h
#ifndef MSG_H
#define MSG_H
#include <Timer.h> // 时间方法相关的头文件
#include <printf.h> // 打印输出相关的头文件,可以串口输出
enum {
AM_CONNECT = 6, //组号为6,发送与接收的组号、信道号必须一致
TIMER_PERIOD_MILLI = 100 // 发送时间间隔100ms
};
typedef nx_struct msgDefind {
nx_uint16_t ID; // 数据包内容,节点ID
}msgDefind;
#endif
- 2、配置组件文件,说明提供关系
// ReceiverAppC.nc
#include "msg.h"
//
configuration ReceiverAppC {}
//
implementation {
components MainC;
components LedsC;
components ReceiverC as App;
components ActiveMessageC;
components new AMReceiverC(AM_CONNECT);
App.Boot->MainC;
App.Leds->LedsC;
// 接收组件
App.Receive->AMReceiverC;
App.AMControl->ActiveMessageC;
}
- 3、模块文件,实现方法及方法的使用
// ReceiverC.nc
#include "msg.h"
//
module ReceiverC {
uses {
interface Boot;
interface Leds;
interface Receive;
interface SplitControl as AMControl;
}
}
//
implementation {
message_t pkt;
bool busy = FALSE;
//
event void Boot.booted() {
call AMControl.start();
}
event void AMControl.startDone(error_t err) {
if(SUCCESS == err) {
call Leds.led2Toggle();
} else {
call AMControl.start();
}
}
event void AMControl.stopDone(error_t err) {}
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) {
// 数据包长度校验
if(len == sizeof(msgDefind)) {
msgDefind* btrpkt = (msgDefind*) payload; // 得到数据包内容
printf("receive id is %d\n", btrpkt -> ID);
printfflush();
}
return msg;
}
//
}
- 4、Makefile
#Makefile
COMPONENT=ReceiverAppC
CFLAGS += -DCC2420_DEF_CHANNEL=14 # 通信信道
CFLAGS += -DCC2420_DEF_RFPOWER=1 # 工作功率
CFLAGS += -I$(TOSDIR)/lib/printf # 加入printf 库
include $(MAKERULES)
接收的主要方法是:
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)
message_t 是指向数据包的指针,void* payload是指向数据包负载的指针,uint8_t len 是负载长度,一般可以通过这个来对数据包进行简单的校验。