文档章节

TinyOS无线传感器网络串口通信和无线通信

cpt725
 cpt725
发布于 2014/11/04 13:04
字数 424
阅读 176
收藏 2

         我作为TinyOS入门新手,在学习串口通信和无线通信时遇到不少问题。本文主要是给出一个自己写的示例程序。无线传感器节点收到其他节点的数据通过串口发送给PC,PC通过串口发送指令到节点,节点再通过无线广播PC发送的指令。

项目包含3个文件:Makefile、SerialC.nc、SerialAppC.nc。

Makefile

COMPONENT=SerialAppC
include $(MAKERULES)

SerialAppC.nc

configuration SerialAppC
{
}

implementation
{
 	components MainC, SerialC, LedsC, ActiveMessageC;
	components  PlatformSerialC;
	components SerialC as App;
	components new TimerMilliC() as Timer0;
	components new AMSenderC(6);
  	components new AMReceiverC(6);
	
 	App -> MainC.Boot;
 	App.Leds -> LedsC;
	App.Timer0->Timer0;

	App.StdControl->PlatformSerialC.StdControl;
	App.UartStream->PlatformSerialC.UartStream;
	
	App.RadioSend -> AMSenderC;
	 App.RadioPacket -> AMSenderC;
  	App.RadioAMPacket -> AMSenderC;
  	App.RadioControl -> ActiveMessageC;
  	App.RadioReceive -> AMReceiverC;
}

SerialC.nc

module SerialC 
{
 	uses interface Leds;
 	uses interface Boot;
 	uses interface Timer<TMilli> as  Timer0;
	
	uses interface Packet as RadioPacket;
 	uses interface AMPacket as RadioAMPacket;
 	uses interface AMSend as RadioSend;
  	uses interface Receive as RadioReceive;
  	uses interface SplitControl as RadioControl;
	uses interface StdControl;
	uses interface UartStream;
}
implementation
{
	uint32_t  count=0;
	uint8_t buff[2];
	bool radiobusy=FALSE;
	bool serialbusy=FALSE;
	message_t pkt;
	typedef nx_struct RadioMsg
	{
		nx_uint16_t nodeid;
		nx_uint16_t count;
	}RadioMsg;
	void setLeds(uint16_t val)
	{
    		if (val & 0x01)
      			call Leds.led0On();
    		else 
      			call Leds.led0Off();
    		if (val & 0x02)
     			 call Leds.led1On();
    		else
      			call Leds.led1Off();
    		if (val & 0x04)
      			call Leds.led2On();
    		else
      			call Leds.led2Off();
  	}
  	event void Boot.booted()
  	{
  		call RadioControl.start();
		call StdControl.start();
  	}
    	event void Timer0.fired(){}
    	
	async event void UartStream.sendDone(uint8_t *buf,uint16_t len,error_t error)
	{
		serialbusy=FALSE;
	}
	async event void UartStream.receivedByte(uint8_t byte)
	{
		call Leds.led2Toggle();
		setLeds(byte);
		if(!radiobusy)
		{
			RadioMsg* btrpkt=(RadioMsg*)(call RadioPacket.getPayload(&pkt,sizeof(RadioMsg)));
			btrpkt->nodeid=TOS_NODE_ID;
			btrpkt->count=byte;
			if(call RadioSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(RadioMsg))==SUCCESS)
				radiobusy=TRUE;
		}
	}
	async event void UartStream.receiveDone(uint8_t *buf,uint16_t len,error_t error)
	{
		
	}
	event void RadioControl.startDone(error_t err)
	{

	}
	event void RadioControl.stopDone(error_t err)
	{
	
	}
	event void RadioSend.sendDone(message_t* msg,error_t error)
	{
		if(&pkt==msg)
			radiobusy=FALSE;
	}
	event message_t*  RadioReceive.receive(message_t* msg,void *payload,uint8_t len)
	{
		call Leds.led1Toggle();
		if(len==sizeof(RadioMsg))
		{
			RadioMsg* btrpkt =(RadioMsg*)payload;
			buff[0]=btrpkt->nodeid;
			buff[1]=btrpkt->count;
			
		}
		if(!serialbusy)
		{
			serialbusy=TRUE;
			call UartStream.send(buff, sizeof(buff) );		
		}
		return msg;
	}
}

以上内容仅供初学者参考。



© 著作权归作者所有

cpt725
粉丝 4
博文 4
码字总数 1200
作品 0
广州
私信 提问
关于6LoWPAN的问题 Contiki TinyOS

请高手指教 1.想做无线传感器网络接入IPv6的课题 是不是应该用6LoWPAN比较好? 2.用6LoWPAN的话,操作系统是用TinyOS比较好还是Contiki(查资料说Contiki下集成uIPv6协议栈和 6LoWPAN适配层 ...

陆恒
2012/03/18
4.8K
8
TinyOS、NesC程序开发经验谈

一、 nesC的语法 NesC是标准C的扩展,应用背景是传感器网络这样的嵌入式系统,这类系统的特点是内存有限,存在任务和中断两类操作。NesC的语法和标准C基本没有区别(NesC应该不能动态分配内存...

吟啸_徐行
2014/03/18
471
0
tinyos-2x有没有像tinyos-1x版本的tinyviz工具

据说还在开发新版本的tinyviz,但是有没有替代品,还有就是资料大都是tinyos-1x版本的,不知道各位有没有tinyos-2x版本的书籍资料

吟啸_徐行
2014/04/23
236
1
TinyOS下TOSSIM仿真CTP

TinyOS的仿真真的是个好东西,跟着下面的步骤做一遍就知道是什么意思了,下面是在Ubuntu下终端的大体演示。 执行命令 TestNetWork文件的源代码里带有仿真需要的文件,待会再解释 。 我在Ubu...

Roam_Co
2018/04/27
0
0
ubuntu下安装minicom

今天看了看嵌入式系统开发,结合之前在tinyos实验中做过的一些串口通信的实验,这里看到linux下也有相关的串口通信软件。所以就在我的ubuntu下安装了minicom,其实这个软件并没有图形化界面,...

demose
2014/11/09
157
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
57分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部