TinyOS·基本发送

之前有玩过一些TinyOS的东西,最近又来开始写一些TinyOS的代码,发现这个玩意儿的细节好多,一不留神连编译都过不去……
好吧,不扯了,希望以后可以一遍编译过,发送的基本代码见下:

  • 1、头文件,申明要用到的头文件、常量,定义数据包的格式等
// msg.h
#ifndef MSG_H
#define MSG_H

#include  // 时间方法相关的头文件
#include  // 打印输出相关的头文件,可以串口输出

enum {
    AM_CONNECT = 6, //组号为6
    TIMER_PERIOD_MILLI = 100 // 发送时间间隔100ms
};

typedef nx_struct msgDefind {
    nx_uint16_t ID; // 数据包内容,节点ID
}msgDefind;

#endif
  • 2、配置组件文件,说明提供关系
// SenderAppC.nc
#include "msg.h"
// 
configuration SenderAppC {}
//
implementation {
    components MainC;
    components LedsC;
    components SenderC as App;
    components ActiveMessageC;
    components new TimerMilliC() as Timer;
    components new AMSenderC(AM_CONNECT); 
   
    App.Boot->MainC;
    App.Leds->LedsC;
    App.Timer->Timer;
    // 无线发送
    App.Packet->AMSenderC;
    App.AMSend->AMSenderC;
    App.AMControl->ActiveMessageC;
}
  • 3、模块文件,实现方法及方法的使用
// SenderC.nc
#include "msg.h"
//
module SenderC {
    uses {
        interface Boot;
        interface Leds;
        interface Timer as Timer;
        interface Packet;
        interface AMSend;
        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 Timer.startPeriodic(TIMER_PERIOD_MILLI);
        } else {
            call AMControl.start();
        }
    }
    
    event void AMControl.stopDone(error_t err) {}
    
    event void Timer.fired() {
        if(! busy) {
            // 数据包准备 
            msgDefind* btrpkt = (msgDefind*)(call Packet.getPayload(&pkt, sizeof(msgDefind))); 
            
            if(NULL == btrpkt) {
                return ;
            }
            
            call Leds.led0Toggle();
            // 使用节点ID填充数据包
            btrpkt->ID = TOS_NODE_ID;
            // 广播发送模式
            if(call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(msgDefind)) == SUCCESS) {
                busy = TRUE;  // 设置天线状态为 忙
            }
        }
    }
    
    event void AMSend.sendDone(message_t* msg, error_t err) {
        if(&pkt == msg) {
            busy = FALSE; // 设置天线状态为 空闲
        }
    }
}
  • 4、Makefile
#Makefile
COMPONENT=SenderAppC
CFLAGS += -DCC2420_DEF_CHANNEL=14 # 通信信道
CFLAGS += -DCC2420_DEF_RFPOWER=1 # 工作功率
CFLAGS += -I$(TOSDIR)/lib/printf # 加入printf 库
include $(MAKERULES)

基本的发送功能就是这样,主要的方法是:

call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(msgDefind))

以及发送成功后天线的复位方法:

 event void AMSend.sendDone(message_t* msg, error_t err)

这两个方法是发送功能实现的核心方法。

你可能感兴趣的:(TinyOS·基本发送)