第七次实验:CC2530平台上多跳通信的TinyOS编程
module P2MM
{
uses interface Boot;
uses interface Timer<TMilli> as Timer0;
uses interface SplitControl as AMControl;
uses interface AMPacket;
uses interface AMSend;
uses interface Receive;
uses interface Packet;
}
implementation
{
typedef nx_struct P2MMsg {nx_uint16_t nodeid[3];nx_uint16_t num;nx_uint16_t counter;}P2MMsg;
uint8_t counter=0;
bool busy =FALSE;
message_t pkt;
task void test() { }
/**********************************************
* 函数名:booted()
* 功 能:系统启动完毕后自动触发
* 参 数:无
***********************************************/
event void Boot.booted()
{
call AMControl.start();
}
/**********************************************
* 函数名:fired()
* 功 能:定时器触发事件
* 参 数:无
***********************************************/
event void Timer0.fired()
{
counter++;
if (!busy)
{
P2MMsg* btrpkt = (P2MMsg*)(call Packet.getPayload(&pkt, sizeof(P2MMsg)));
btrpkt->num=0;
btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;
btrpkt->counter = counter;
call AMPacket.setGroup(&pkt,TOS_IEEE_GROUP);
if (call AMSend.send(0xFFFF, &pkt, sizeof(P2MMsg)) == SUCCESS)
busy = TRUE;
}
}
/**********************************************
* 函数名:startDone(error_t err)
* 功 能:SplitControl控制启动完成事件
* 参 数:error_t err
***********************************************/
event void AMControl.startDone(error_t err)
{
if(err==SUCCESS)
{
if(TOS_NODE_ID!=0x1)
call Timer0.startPeriodic(1000);
}
else
call AMControl.start();
}
/**********************************************
* 函数名:sendDone(message_t* msg, error_t erro)
* 功 能:AM消息发送完毕事件
* 参 数:message_t* msg, error_t erro
***********************************************/
event void AMSend.sendDone(message_t* msg, error_t erro)
{
if (&pkt == msg)
busy = FALSE;
}
/**********************************************
* 函数名:receive(message_t* msg, void* payload, uint8_t len)
* 功 能:Receive接收事件
* 参 数:message_t* msg, void* payload, uint8_t len
***********************************************/
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)
{
if (len == sizeof(P2MMsg))
{
P2MMsg* btrpkt = (P2MMsg*)payload;
DbgOut(9,"Data is %d,Start is %d,Other is %d,%d\r\n",(uint16_t)btrpkt->counter,
(uint16_t)btrpkt->nodeid[0],(uint16_t)btrpkt->nodeid[1],(uint16_t)btrpkt->nodeid[2]);
btrpkt->num++;
if(TOS_NODE_ID!=0x1){
if(btrpkt->num<3){
bool flag=TRUE;
uint16_t i;
for(i=0;i<btrpkt->num;i++){
if(btrpkt->nodeid[i] == TOS_NODE_ID)
flag=FALSE;
}
if(flag){
btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;
call AMSend.send(0xFFFF, msg, sizeof(P2MMsg));
}
}
}
}
}
event void AMControl.stopDone(error_t err) { }
}
configuration P2MC {}
#define AM_DATA_TYPE 123
implementation
{
components P2MM as App;
components MainC;
App.Boot ->MainC;
components ActiveMessageC as AM; //消息组件
App.Packet -> AM.Packet;
App.AMPacket -> AM.AMPacket;
App.AMSend -> AM.AMSend[AM_DATA_TYPE];
App.Receive -> AM.Receive[AM_DATA_TYPE];
App.AMControl -> AM.SplitControl;
components new TimerMilliC () as Timer0;
App.Timer0 ->Timer0;
}
COMPONENT= P2MC
PFLAGS += -DUART_DEBUG
PFLAGS += -DUART_BAUDRATE=9600
include $(MAKERULES)
好课程内容。
第七次实验:CC2530平台上多跳通信的TinyOS编程的更多相关文章
- 实验三 CC2530平台上CC2530平台上定时器组件的
实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...
- 第一次实验: CC2530平台上电源管理与休眠
实验一 CC2530平台上电源管理与休眠 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的认识TinyOS编程的基础和简单的程序编写 学生通过本实验能够初步的了解和掌握Ti ...
- 实验六 CC2530平台上P2P通信的TinyOS编程
实验六 CC2530平台上P2P通信的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的掌握射频通信TinyOS编程方法 学生通过本实验应理解TinyOS中 ...
- [4G]Linux平台上实现4G通信
转自:http://blog.sina.com.cn/s/blog_7880d3350102wb92.html 在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发 ...
- 实验五 CC2530平台上ADC组件的TinyOS编程
实验五 CC2530平台上ADC组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握传感器的ADC组件应用方法 学生通过本实验能够初步的了解和掌握CC ...
- 实验四 CC2530平台上UART组件的TinyOS编程
实验四 CC2530平台上UART组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530的UART.及其TinyOS编程方法 学生通过本实验 ...
- 第二次实验:CC2530平台上GPIO组件的TinyOS编程
实验二 CC2530平台上GPIO组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生理解和掌握CC2530的GPIO及外部中断,及其TinyOS编程方法 学 ...
- 检验实时3D像素流送平台好坏的七个标准!(上)
将交互式3D像素流送技术作为有价值的企业工具之后,就该寻找像素流送服务供应商了.问题在于交互式3D像素流送是一种新兴技术,因此很难知道要问供应商的正确问题.在开始使用之前,这里有7个问题,您应该从候选 ...
- JVM 平台上的各种语言的开发指南
JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...
随机推荐
- css 三角
http://peunzhang.github.io/demo/css_angle/index.html
- python 网络编程(Socket)
# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...
- Delphi下的WinSock编程
一.定址 要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址.Winsock 2引入了几个新的.与协议无关的函数,它们可和任何一个地址家族一起使用:但是大多数情况下,各 ...
- Vue混入
Vue 混入 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 数据对象合 ...
- tensorflow tfrecord文件存储
import tensorflow as tf import numpy as np import skimage from skimage import data, io, color from P ...
- tomcat8常用配置说明
链接:https://www.jianshu.com/p/8b1c75951f70 2.tomcat8运行期错误HTTP头解析错误 修改tomcat的server.xml中的中配置 设置为8k &l ...
- spring中ApplicationListener的用法
1.实现ApplicationListener接口,并重写onApplicationEvent方法 @Component public class RSAKeyInitListener impleme ...
- thinkPHP验证码不显示问题
使用验证码的时候,不显示图片时,要清理下输出缓存:ob_clean_end();
- gprinter佳博打印机androidSDK
最近在用佳博的SDK做打印的功能,由于一直做的是.net,没有android的基础,这个功能我做了一个多月,包括前期调研佳博打印机的打印方式.佳博打印机有两种打印方式,一种是标签打印,要用到TscCo ...
- 推理机Jess,Racer,Jena
推理机 Jess(Java Expert Shell System)是基于Java语言的CLISP推理机. CLISP是基于产生式的前向推理引擎,许多上层的推理任务,都要映射到这个推理引擎上来运行. ...