美文网首页
TinyOS·基本发送

TinyOS·基本发送

作者: JokerAIF | 来源:发表于2016-03-11 23:39 被阅读0次

之前有玩过一些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、配置组件文件,说明提供关系
// 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<TMilli> 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·基本发送

    之前有玩过一些TinyOS的东西,最近又来开始写一些TinyOS的代码,发现这个玩意儿的细节好多,一不留神连编译都...

  • TinyOS·基本接收

    接上篇TinyOS·基本发送来写这篇TinyOS的基本接收。 1、头文件,申明要用到的头文件、常量,定义数据包的格...

  • TinyOS

    分享一个自写的,模仿Linux0.11系统的一个小型操作系统。此源码比较简短,功能虽然有限,但是可以对Linux系...

  • ActiviteMQ接收和发送消息基本流程

    ActiviteMQ接收和发送消息基本流程 发送消息的基本步骤: (1)、创建连接使用的工厂类JMS Connec...

  • 10.1 项目沟通管理

    沟通及概念说明 沟通的基本模型 用于显示信息如何在双方之间被发送和接收 基本沟通模型包括5个基本状态:已发送、已收...

  • 基本样例

    基本样例生产者有三种模式 异步发送 同步发送 单项发送同步发送,当消息发送的时,代码会阻塞知道borker返回信息...

  • Android-Handler发送消息

    Handler 发送消息 android中使用handler发送异步消息刷新UI是最基本的知识点,但如何优雅发送一...

  • Android中广播的基本使用及说明

    1、Android广播发送及广播类型 广播发送的基本代码: Intent intent = new Intent(...

  • 4、RocketMQ基础-消息发送样例

    消息发送样例 导入MQ客户端依赖 2、* 消息发送者步骤分析 消息消费者步骤分析 基本样例 消息发送 发送同步消息...

  • 认识NSURLSession

    1.0 NSURLSession的基本使用 (1)使用步骤 (2)关于task (3)发送get请求 (4)发送g...

网友评论

      本文标题:TinyOS·基本发送

      本文链接:https://www.haomeiwen.com/subject/ktdxlttx.html