uses interface Timer
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
#include \
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 COMMUNICATIO***\ TinyOS 分享到: QQ好友和群 QQ空间 腾讯微博 腾讯朋友 收藏 转播 淘帖 相关帖子 ? ? TinyOS系统从2.1升级到2.1.2教程 ? ? TinyOS 2.x中如何修改message_t中playload的长度 ? ? tinyos CTP温湿度采集android终端显示 ? ? TinyOS2.x启动顺序 ? ? TinyOS中的I/O中断使用 ? ? TinyOs无线消息收发问题 ? ? 关于TinyOS实例化多个定时器的问题 ? ? TinyOS在MSP430F2618上移植(二)之USCI ? ? TinyOS在MSP430F2618上移植(三)之LCD TinyOS学习笔记9-简单的转发程序
本转发程序实现的功能是1号节点发送数据,2号节点接收到数据后转发给3号节点 在BlinkToRadio的基础上,修改BlinkToRadioC.nc如下: #include
#include \
module BlinkToRadioC { uses interface Boot; uses interface Leds;
uses interface Timer
uses interface SplitControl as AMControl; }
implementation {
uint16_t counter; message_t pkt; bool busy = FALSE;
event void Boot.booted() { call AMControl.start(); }
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++;
if (TOS_NODE_ID==1&&!busy) { BlinkToRadioMsg* btrpkt =
(BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg))); if (btrpkt == NULL) { return; }
btrpkt->nodeid = TOS_NODE_ID; btrpkt->counter = counter; if (call AMSend.send(2,
&pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) { busy = TRUE; } } }
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);
if (TOS_NODE_ID==2&&btrpkt->nodeid==1&&!busy) {
BlinkToRadioMsg* temppkt = (BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg)));
temppkt->nodeid=btrpkt->nodeid;
temppkt->counter=btrpkt->counter;
if (call AMSend.send(3, &pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) { busy = TRUE; } } }
return msg; } }
经过实验,在没有2号节点的情况下,3号节点收不到数据,加入2号节点后,3号节点收到数据。
TinyOS学习笔记10-节点与计算机利用串口通信1 节点与计算机利用串口通信1
节点与计算机的通信是通过support/SDk/java和support/sdk/c,可以利用java代码或者C代码来实现串口的通信。中的内容,主要介绍了java的应用,如果在以后遇到要使用c语言连接串口的话,到时再研究。 1.如何查看本机的串口,使用motelist命令,我的机器显示如下信息:
root@ubuntu:~# motelist
Reference Device Description
---------- ---------------- --------------------------------------------- XBS518PB /dev/ttyUSB0 XBOW Crossbow Telos Rev.B
java net.TinyOS.tools.Listen -comm serial@/dev/ttyUSB0:telosb
本命令代表使用java命令来执行串口的监听,net.tinyos.tools.Listen为在support/sdk/java中的一个程serial@/dev/ttyUSB0:telosb为程序需要使用的参数。由于连接每一个设备使用不同的波特率,其中telosb代表的在后面我们将详细分析以下这个Listen的程序。
下面首先看一下TestSerial这个例子:
本程序为节点通过串口向计算机周期性的发送数据,并显示在计算机上。 本程序有如下文件,将进行详细的分析:
TestSerial.h文件:
#ifndef TEST_SERIAL_H

