TinyOS学习笔记8-简单发送接收数据
2013-01-26 19:25
337 查看
简单发送接收数据
本节为对BlinkToRadio的分析,从而了解简单的收发过程。
我们读BlinkToRadio修改如下:发送本节点的id给其他的节点
BlinkToRadio.h
#ifndef BLINKTORADIO_H
#define BLINKTORADIO_H
enum {
AM_BLINKTORADIO = 6, //AM数据包的类型
TIMER_PERIOD_MILLI = 250 //发送的时间间隔为250ms
};
//定义发送数据包的负载部分
typedef nx_struct BlinkToRadioMsg {
nx_uint16_t nodeid; //本节点的id
nx_uint16_t counter; //计数
} BlinkToRadioMsg;
#endif
BlinkToRadioC.nc 文件分析
#include <Timer.h>
#include "BlinkToRadio.h"
module BlinkToRadioC {
//定义使用的接口
uses interface Boot; //从Boot开始启动
uses interface Leds; //led灯
uses interface Timer<TMilli> as Timer0;//时间
uses interface Packet; //数据包,在获取负载处用到
uses interface AMPacket; //AM数据包,需要实现SendDone()
uses interface AMSend; //AM发送数据
uses interface Receive; //接收数据包
uses interface SplitControl as AMControl; //Split操作
}
implementation {
uint16_t counter; //发送的次数
message_t pkt; //数据包
bool busy = FALSE; //节点是否忙,开始为不忙
//从此处启动,开始程序
event void Boot.booted() {
call AMControl.start(); //调用Split操作的开始,是否成功在startDone()处判断
}
//判断开始是否完成
event void AMControl.startDone(error_t err) {
if (err == SUCCESS) {
//成功调用时间周期执行
call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
}
else {
//未成功重新开始
call AMControl.start();
}
}
//停止判断
event void AMControl.stopDone(error_t err) {
}
//时间的每次周期执行的内容,发送数据
event void Timer0.fired() {
counter++;//发送数据个数加1
if (!busy) {//节点不忙,则开始发送数据
//设置数据包的负载,btr指向数据包的负载部分
BlinkToRadioMsg* btrpkt =
(BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg)));
if (btrpkt == NULL) {//没有数据就不发送
return;
}
btrpkt->nodeid = TOS_NODE_ID; //发送节点的ID,TOS_NODE_ID为在make
telosb install,1时设置的
btrpkt->counter = counter; //发送数据包的个数
//开始发送数据,AMSend.send(广播地址,负载数据,负载数据的大小)
if (call AMSend.send(AM_BROADCAST_ADDR, //修改AM_BROADCAST_ADDR为2,则节点只向2号节点发,其他节点不响应
&pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) {
busy = TRUE;//调用发送数据成功,节点正在发送数据,变为忙的状态,是否发送完成在sendDone里判断
}
}
}
event void AMSend.sendDone(message_t* msg, error_t err) {
if (&pkt == msg) {//如果发送的数据是所设置的数据,发送成功,节点变为不忙
busy = FALSE;
}
}
//接收数据部分
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){
if (len == sizeof(BlinkToRadioMsg)) {//判断接受的数据的长度,是否为所需要的
BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload; //获取数据
call Leds.set(btrpkt->nodeid); //设置led为获取节点的id
}
return msg; //返回数据
}
}
BlinkToRadioAppC.nc文件,实现连线
#include <Timer.h>
#include "BlinkToRadio.h"
configuration BlinkToRadioAppC {
}
implementation {
components MainC;
components LedsC;
components BlinkToRadioC as App;
components new TimerMilliC() as Timer0;
components ActiveMessageC;
components new AMSenderC(AM_BLINKTORADIO);
components new AMReceiverC(AM_BLINKTORADIO);
App.Boot -> MainC;
App.Leds -> LedsC;
App.Timer0 -> Timer0;
App.Packet -> AMSenderC;
App.AMPacket -> AMSenderC;
App.AMControl -> ActiveMessageC;
App.AMSend -> AMSenderC;
App.Receive -> AMReceiverC;
}
在编译时出现警告问题,未解决,估计和平台有关
/opt/tinyos-2.1.1/tos/chips/cc2420/lpl/DummyLplC.nc:39:2: warning: #warning "*** LOW POWER COMMUNICATIONS DISABLED ***"
本节为对BlinkToRadio的分析,从而了解简单的收发过程。
我们读BlinkToRadio修改如下:发送本节点的id给其他的节点
BlinkToRadio.h
#ifndef BLINKTORADIO_H
#define BLINKTORADIO_H
enum {
AM_BLINKTORADIO = 6, //AM数据包的类型
TIMER_PERIOD_MILLI = 250 //发送的时间间隔为250ms
};
//定义发送数据包的负载部分
typedef nx_struct BlinkToRadioMsg {
nx_uint16_t nodeid; //本节点的id
nx_uint16_t counter; //计数
} BlinkToRadioMsg;
#endif
BlinkToRadioC.nc 文件分析
#include <Timer.h>
#include "BlinkToRadio.h"
module BlinkToRadioC {
//定义使用的接口
uses interface Boot; //从Boot开始启动
uses interface Leds; //led灯
uses interface Timer<TMilli> as Timer0;//时间
uses interface Packet; //数据包,在获取负载处用到
uses interface AMPacket; //AM数据包,需要实现SendDone()
uses interface AMSend; //AM发送数据
uses interface Receive; //接收数据包
uses interface SplitControl as AMControl; //Split操作
}
implementation {
uint16_t counter; //发送的次数
message_t pkt; //数据包
bool busy = FALSE; //节点是否忙,开始为不忙
//从此处启动,开始程序
event void Boot.booted() {
call AMControl.start(); //调用Split操作的开始,是否成功在startDone()处判断
}
//判断开始是否完成
event void AMControl.startDone(error_t err) {
if (err == SUCCESS) {
//成功调用时间周期执行
call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
}
else {
//未成功重新开始
call AMControl.start();
}
}
//停止判断
event void AMControl.stopDone(error_t err) {
}
//时间的每次周期执行的内容,发送数据
event void Timer0.fired() {
counter++;//发送数据个数加1
if (!busy) {//节点不忙,则开始发送数据
//设置数据包的负载,btr指向数据包的负载部分
BlinkToRadioMsg* btrpkt =
(BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg)));
if (btrpkt == NULL) {//没有数据就不发送
return;
}
btrpkt->nodeid = TOS_NODE_ID; //发送节点的ID,TOS_NODE_ID为在make
telosb install,1时设置的
btrpkt->counter = counter; //发送数据包的个数
//开始发送数据,AMSend.send(广播地址,负载数据,负载数据的大小)
if (call AMSend.send(AM_BROADCAST_ADDR, //修改AM_BROADCAST_ADDR为2,则节点只向2号节点发,其他节点不响应
&pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) {
busy = TRUE;//调用发送数据成功,节点正在发送数据,变为忙的状态,是否发送完成在sendDone里判断
}
}
}
event void AMSend.sendDone(message_t* msg, error_t err) {
if (&pkt == msg) {//如果发送的数据是所设置的数据,发送成功,节点变为不忙
busy = FALSE;
}
}
//接收数据部分
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){
if (len == sizeof(BlinkToRadioMsg)) {//判断接受的数据的长度,是否为所需要的
BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload; //获取数据
call Leds.set(btrpkt->nodeid); //设置led为获取节点的id
}
return msg; //返回数据
}
}
BlinkToRadioAppC.nc文件,实现连线
#include <Timer.h>
#include "BlinkToRadio.h"
configuration BlinkToRadioAppC {
}
implementation {
components MainC;
components LedsC;
components BlinkToRadioC as App;
components new TimerMilliC() as Timer0;
components ActiveMessageC;
components new AMSenderC(AM_BLINKTORADIO);
components new AMReceiverC(AM_BLINKTORADIO);
App.Boot -> MainC;
App.Leds -> LedsC;
App.Timer0 -> Timer0;
App.Packet -> AMSenderC;
App.AMPacket -> AMSenderC;
App.AMControl -> ActiveMessageC;
App.AMSend -> AMSenderC;
App.Receive -> AMReceiverC;
}
在编译时出现警告问题,未解决,估计和平台有关
/opt/tinyos-2.1.1/tos/chips/cc2420/lpl/DummyLplC.nc:39:2: warning: #warning "*** LOW POWER COMMUNICATIONS DISABLED ***"
相关文章推荐
- TinyOS学习笔记8-简单发送接收数据
- STM32学习笔记之USB数据接收和发送流程分析
- Socket网络编程学习笔记(5):发送和接收实体类数据
- php学习笔记(三十)ajax请求和接收参数的实现方式(包括json数据格式的简单处理)
- 《疯狂Java讲义(第2版)》学习笔记:使用DatagramSocket发送接收数据
- iOS学习笔记4-GCDAsyncUdpSocket的使用(实现异步发送接收数据)
- Socket网络编程学习笔记(5):发送和接收实体类数据
- FPGA实验——串口发送/接收学习笔记
- [BizTalk][Adapter][部署]BTS学习笔记1:建立一个简单的Biztalk数据交换项目(一)
- [Nodejs]初探nodejs学习笔记- 如何使用nodejs接收get/post 数据(参数)
- JavaMail学习笔记-1(简单纯文本的邮件发送)
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
- Google Android开发者文档系列-创建有内容分享特性的应用之接收其它应用程序发送的简单数据
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- 十.TCP与UDP发送和接收数据的简单实现
- 【C++】学习笔记二——简单数据类型
- 《第一行代码Java》数据表与简单Java类映射部分学习笔记与代码
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
- TCP带外数据学习总结(概念,发送接收过程,数据到达检测,代码实现)
- Android(java)学习笔记80:UDP协议发送数据