物联网实验实验一基础实验1.1串口调试组件实验1.1.1实验目的在程序开发过程中,往往需要对编写的代码进行调试,前面介绍了通过LED进行调试的方法,该实验主要是介绍串口调试的方式。本实验通过一个简单的例子让读者学会串口调试编写的代码。1.1.2实验原理串口调试的语句格式为,ADBG(x,args…),其中x为调试级别。我们在Makefile中定义一个默认级别,在写代码的时候只有x不小于Makefile中定义的默认级别时,该语句才能被输出到串口,args…为打印的内容,具体的格式和c语言中printf相同。ADBG(….)语句实际上是通过CC2430的串口Uart0输出打印语句的。1.1.3实验步骤1.将基站同电脑用烧录线连接好,打开基站的开关,同时将基站的烧录开关拨上去2.用串口线将基站和PC机器连接起来3.打开串口助手(串口助手在光盘中的目录为$(光盘目录)\辅助工具\串口助手),波特率设置为9600,其中串口号要根据自己的情况选择,点击【打开串口】。4.打开Cygwin开发环境5.在Cygwin界面中执行cdapps/Demos/Basic/SerialDebug,进入到串口调试实验目录下。6.在串口调试代码目录下执行makeantc3install,进行编译和烧录。7.烧录成功后,实验现象为串口有内容输出,输出内容如下图。1.1.4继续实验通过级别控制,使得某些调试语句没有被输出到串口修改方案:如实验原理说讲ADBG(x,args…),x是调试级别,当x小于makefile文件定义的默认级别时,此ADBG语句将不被执行。所以可以做如下修改:…………#defineDBG_LEV3000#defineRPG_LEV2000…………ADBG(DBG_LEV,\r\n\r\nDEMOofSerialDebug\r\n,'x');ADBG(DBG_LEV,1.Thisisastring,andthisischar'%c'\r\n,'x');ADBG(DBG_LEV,2.NUM1:HEX=0x%x,DEC=%d\r\n,(int)(num1),(int)(num1));ADBG(RPG_LEV,2.NUM2:HEX=0x%lx,DEC=%ld\r\n,(uint32_t)(num2),(uint32_t)(num2));ADBG(RPG_LEV,3.FLOAT:%f\r\n,float1);…………这样,第4句和第5句就不会输出。输出内容如下图所示:1.1.5碰到的问题第一次将基站同电脑用烧录线连接起来时,电脑会无法识别此USB设备。这样就不能把程序烧录到基站和节点当中。需要先在PC机上安装此USB设备的驱动程序。具体操作是在设备管理器当中,双击图标有感叹号的设备,点击更新驱动程序,路径为:F:\实验室软件\物联网\驱动程序。1.1.6心得体会本实验属于验证性实验,比较简单,代码也浅显易懂。主要通过此实验学习了如何通过串口对程序进行调试,这个调试功能是分级别调试的,只有调用处的调试级别不小于makefile中定义的调试级别的时候才会被输出到串口。1.2串口组件通信实验1.2.1实验目的能够掌握CC2530中的串口的通讯功能,包括串口的发送功能和接受功能以及串口波特率设置功能。为今后的综合实验打下基础。1.2.2实验原理平台提供了串口通信模块组件PlatformSerialC,该组件提供了三个接口:StdControl、UartStream以及CC2530UartControl,其中,StdControl用于控制串口通信模块的开关,UartStream提供了串口收发功能;CC2530UartControl接口用于设置串口通信得到波特率。其中UartStream的实现,实际上是在串口层做了一个缓冲,每次将发送缓冲器的数据一个字节一个字节地往串口发送,最终达到串口的连续传输。1.2.3实验步骤1.将基站同电脑用烧录线连接好,打开基站的开关2.用串口线将基站和PC机器连接起来3.打开串口助手(串口助手在光盘中的目录为$(光盘目录)\辅助工具\串口助手),波特率设置为9600,其中串口号要根据自己的情况选择,点击【打开串口】。4.打开Cygwin开发环境5.在Cygwin界面中执行cdapps/Demos/Basic/SerialIO,进入到串口通讯实验目录下。6.在串口通讯代码目录下执行makeantc3install,进行编译和烧录。7.烧录成功后,实验现象为串口有内容输出。8.根据串口输出的提示进行操作,串口提示为按下键盘【1】,基站的蓝灯会闪烁一下,按下键盘【2】,基站的黄灯会闪烁一下。如果是其它按键,串口会提示“Errorkey”,如下图。1.2.4继续实验实现一个串口实验,在串口助手中实现回显的功能。修改方案:在taskvoidlightLED()函数当中,当m_echo_buf==’1’和m_echo_buf==’2’时其各自的ADBG语句后面都多加一句postshowMenuTask();taskvoidlightLED(){if(m_echo_buf=='1'){LED_BLUE_TOGGLE;/*切换蓝色LED灯*/ADBG(DBG_LEV,YouchoosetotoggleBLUELED\r\n);postshowMenuTask();}elseif(m_echo_buf=='2'){LED_YELLOW_TOGGLE;/*切换黄色LED灯*/ADBG(DBG_LEV,YouchoosetotoggleYELLOWLED\r\n);postshowMenuTask();}else{ADBG(DBG_LEV,ErrorKey%c\r\n,m_echo_buf);postshowMenuTask();}}调试结果:1.2.5碰到的问题此实验相对比较容易,基本无碰上什么问题。1.2.6心得体会此实验的代码看起来是挺容易读懂的,但是在编程实现上缺没有那么容易。TinyOS系统事先已经将串口的发送和接受功能封装成接口来让我们调用,为我们使用串口的功能提供的极大的便利。这是nesC的一大优势。提供各式各样的内部组件也为我们做物联网的开发应用节省了许多编程上的时间。1.3Flash组件读写实验1.3.1实验目的掌握CC2530芯片Flash的读写操作,同时为后面的综合实验做准备。1.3.2实验原理Flash存储器具有非易失的特点,即其存储的数据掉电后不会丢失。因此常用来存储一些设备参数等。Flash存储器的组织结构为:每页2KB,共64页(CC2530-F128)。Flash存储器的写入有别于RAM、EEPROM等其他存储介质,写Flash时,每bit可以由1变为0而不能由0变为1,必须分页擦除后才能恢复全“1”。因此,需要修改某页中的部分字节时,需要将本页中用到的所有数据读出到RAM空间中修改,然后擦除本页,再将RAM中的数据写入。CC2530中使用Flash控制器来处理Flash读写和擦除。使用DMA传输和CPU直接访问SFR都可以配合Flash控制器完成写Flash等操作。DMA写Flash:需要写入的数据应存于XDATA空间,其首地址作为DMA的源地址,目的地址固定为FWDATA,触发事件为FLASH。当FCTL.WRITE置“1”时触发DMA,传输长度应为4的整数倍,否则需要补充;选择字节传输,传输模式为单次模式,选择高优先级。1.3.3实验步骤1.将基站同电脑用烧录线连接好,打开基站的开关2.用串口线将基站和PC机器连接起来3.打开串口助手4.打开Cygwin开发环境5.在Cygwin开发环境中执行cdapps/Demos/Basic/Flash6.在Flash目录下执行makeantc3install,进行软件的编译和烧录7.烧录成功后,串口有内容输出,具体如下图1.3.4继续实验自己定义一个结构体,并且将结构体的内容写入到0x1fff8,并且在写完后将结构体的数据读取出来通原始数据进行比较。修改方案:将数组ieee2改为结构体,在结构体里面定义一个数组。structSuper{uint8_tnum[8];};uint8_tieee[8]={0};uint8_tieee1[8]={7,2,4,11,21,3,92,1};taskvoidinitTask(){uint8_ti;structSupersuper;for(i=0;i8;i++){super.num[i]=ieee1[i];}ADBG(DBG_LEV,readnow\n);callHalFlash.erase((uint8_t*)0x1fff8);for(i=0;i8;i+=4){callHalFlash.write((uint8_t*)(0x1FFF8+i),(&super.num+i),4);}callHalFlash.read(ieee,(uint8_t*)0x1FFF8,8);ADBG(DBG_LEV,readok.\n);for(i=0;isizeof(ieee);++i){ADBG(DBG_LEV,super.num[%d]=%d\n,(int)i,(int)ieee[i]);}}调试结果:1.3.5碰到的问题在做继续实验的时候,原本想,像对数组初始化那样直接给结构体里面的数组赋初值,但是如果这样做了,在编译的时候就会出现错误。在定义结构体类型的时候不能给结构体内定义的数组赋初值,在定义好结构体变量后,也不能直接给该结构体变量的数组变量赋初值。最保险的方法就是对机构体变量的数组变量挨个赋值。1.3.6心得体会这次实验学习了Flash存储器读写的基本原理,并通过了实验来验证对Flash存储器的基本操作实现。这次实验相对比较容易,就是在做继续实验的时候对nesC的结构体的基础知识了解不够深而卡了一小会儿。这些基础实验虽然比较简单,但是在之后的综合实验上会经常使用到,为后面的综合实验做准备。实验二点对点通信实验2.1实验目的1.了解节点对点通信过程2.学会ATOS平台通讯模块(ActiveMessage)的使用2.2实验原理本实验使用TinyOS中的活动消息(ActiveMessage)模型实现点对点通信,活动模型组件ActiveMessageC包含了网络协议中路由层以下的部分。在ATOS平台下,ActiveMessageC包含的主要功能有:CSMA/CA、链路层重发、重复包判断等机制。其中,CSMA/CA机制使节点在发送数据之前,首先去侦听信道状况,只有在信道空闲的情况下才发送数据,从而避免了数据碰撞,保证了节点间数据稳定传输;链路层重发机制是当节点数据发送失败时,链路层会重发,直到发送成功或重发次数到达设定的阈值为止,提高了数据成功到达率;重复包判断机制是节点根据发送数据包的源节点地址及数据包中的dsn域判断该包是不是重复包,如果是重复包,则不处理,防止节点收到同一个数据包的多个拷贝。ActiveMessageC向上层提供的接口有AMSend、Receive、AMPacket、Packet、Snoop等。AMSend接口实现数据的发送,Receive接口实现数据的接收,Snoop是接收发往其它节点的数据,AMPacket接口用于设置和提取数据包的源节点地址、目的地址等信息,Packet接口主要是得到数据包的有效数据长度(payloadlength)、最大有数据长度、有效数据的起始地址等。AMSend、Receive、Snoop都是参数化接口,参数为一个8位的id号,类似于TCP/IP协议中的端口号。两个节点通信时,发送节点使用的AMSend接口的参数id必须与接收节点的Receive接口的参数id一致。在TinyOS操作系统下,所有的数据包都封装到一个叫message_t的结构体中。message_t结构体包含四个部分:header、data、footer、metadata四个部分。其中header中包含了数据包长度、fcf、dsn、源地址、目的地址等信息;metadata包含了rssi等信息,详见cc2420.h、Messag