首页 > 代码库 > Tinyos学习笔记(一)

Tinyos学习笔记(一)

简述:发送和接受数据的程序分别烧录到两个节点上,发送方发送流水灯数据,接受方接受数据并实现流水灯

1、发送和接受程序用到的组件及其接口如图(通过make telosb docs获得)所示:

 

2、发送程序sendC.nc代码:

#include "Timer.h"
#include "send.h"

module sendC @safe()
{
    uses{
        interface Boot;
        interface Timer<TMilli> as Timer;

        interface SplitControl as AMControl;
        interface Packet;
        interface AMSend;
    }
}
implementation
{
    uint8_t dataS=1;
    bool busy=FALSE;//if write ‘false‘,`false‘ undeclared here (not in a function)
    message_t pkt;

    void startTimer()//internal function
    {
        call Timer.startPeriodic(500);
    }

    //start radio
    event void Boot.booted()
    {
        call AMControl.start();
    }
    event void AMControl.startDone(error_t err)
    {
        if(SUCCESS==err)
            startTimer();
        else
            call AMControl.start();
    }
    event void AMControl.stopDone(error_t err){}
    
    task void compute()
    {
        if(dataS>=0x04)
            dataS=1;
        else
            dataS=dataS<<1;
    }
    event void Timer.fired()
    {    
        if(!busy)    
        {
            MsgToRadio* trpkt=(MsgToRadio*)(call Packet.getPayload(&pkt,sizeof(MsgToRadio)));
            if(NULL==trpkt)
                return;
            trpkt->nodeid=TOS_NODE_ID;//发送节点的ID,TOS_NODE_ID为在make telosb install,1时设置的
            trpkt->dataS=dataS;
            //AM_BROADCAST_ADDR广播模式,修改AM_BROADCAST_ADDR为2,则节点只向2号节点发,其他节点不响应
            if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(MsgToRadio))==SUCCESS)//在if(!busy)里面????
                busy=TRUE;
        }        
        post compute();
    }
    event void AMSend.sendDone(message_t* msg,error_t err)
    {
        if(msg==&pkt)
            busy=FALSE;
    }
}

3、发送程序sendCAppC.nc代码:

configuration sendAppC
{
}
implementation
{
    components MainC,sendC;
    components new TimerMilliC();

    components ActiveMessageC;
    components new AMSenderC(6);

    sendC.Boot->MainC;
    sendC.Timer->TimerMilliC;

    sendC.AMControl->ActiveMessageC;
    sendC.Packet->AMSenderC;
    sendC.AMSend->AMSenderC;

}

4、发送程序send.h代码:

#ifndef SEND_H
#define SEND_H

typedef nx_struct MsgToRadio
{
    nx_uint8_t nodeid;
    nx_uint8_t dataS;
}MsgToRadio;

#endif

5、接受程序核心代码:

//an event-driven process
event message_t* Receive.receive(message_t* msg,void* payload,uint8_t len)
{
    if(len==sizeof(MsgFromRadio))
    {
        MsgFromRadio* frpkt=(MsgFromRadio*)payload;
        call Leds.set(frpkt->dataR);
    }
    return msg;
}

参考网址:http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication