物联网课程设计实验成员:指导教师:2014/7/3日期:实验一 LED组件一、实验内容LED组件:绿灯一直处于熄灭的状态,红灯不停闪烁二、实验步骤1) 将基站同电脑用烧录线连接好,打开基站的开关,同时将基站的烧录开关拨上去。
2) 打开 Cygwin 开发环境。
3) 在 Cygwin 界面中执行 cd apps/Demos/Basic/Led,进入到 LED 实验目录下。
4) 在 LED 实验目录下执行 make antc5 install 进行编译和烧录。
5) 可以看到实验现象为基站上的绿灯一直处于熄灭的状态,红灯不停闪烁。
三、实验代码/**LED 示例程序的实现模块,简单的点亮3个LED灯@date 2010-1*/module LedM{uses interface Boot;}implementation{/** LED灯演示*/task void DemoLed(){/** 目前节点上提供两个LED灯LED_BLUE -> 蓝灯LED_YELLOW -> 黄灯*/int i,j;while(1){LED_YELLOW_ON; //熄灭黄色LED灯for(i=0;i<1000;i++)for(j=0;j<500;j++);LED_BLUE_OFF; //点亮蓝色LED灯for(i=0;i<1000;i++)for(j=0;j<500;j++);LED_BLUE_ON; //熄灭蓝色 LED灯}}/** 启动事件处理函数,在LED.nc已经关联到MainC.Boot 接口系统启动后会调用此函数*/event void Boot.booted(){post DemoLed();}}实验二定时器组件一、实验内容通过定时器让绿色灯闪烁,并且闪烁三次后停止闪烁。
二、实验步骤1) 将基站同电脑用烧录线连接好,打开基站的开关,同时将基站的烧录开关拨上去。
2) 打开 Cygwin 开发环境。
3) 在Cygwin 界面中执行 cd apps/Demos/Basic/ Timer,进入到定时器实验目录下。
4) 在定时器代码目录下执行 make antc5 install,进行编译和烧录。
5) 实验现象为基站上绿色灯闪烁,并且闪烁三次后停止闪烁。
三、实验代码#define DBG_LEV 5module TimerLedM{uses interface Boot;/* Timer为系统接口TMilli指明了定时器的精度为毫秒 */uses interface Timer<TMilli> as Timer1; /* as关键字为接口别名 */ uses interface Timer<TMilli> as Timer2;}implementation{/** 任务: 切换黄色LED灯 */task void ToggleLedYellow(){LED_YELLOW_TOGGLE;}/** 启动事件处理函数,在TimerLed.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted(){LED_BLUE_ON;call Timer2.startPeriodic(1000);/** 定时器1: 持续工作,每隔1s触发一次 */call Timer1.startPeriodic(6000);/** 定时器2: 持续工作,每隔3s触发一次 *///call Timer2.startPeriodic(5000);}/** 定时器 1的事件处理函数 */event void Timer1.fired(){/** 事件处理中直接切换蓝色LED 灯 */ADBG(5, led blue toggle.\r\n);//LED_BLUE_TOGGLE;LED_YELLOW_ON;call Timer2.stop();/**停止定时器触发*/call Timer1.stop();}/** 定时器2的事件处理函数 */event void Timer2.fired(){ADBG(5, led yellow toggle.\r\n);post ToggleLedYellow();}}实验三串口调试一、实验内容通过级别控制,使得某些调试语句没有被输出到串口。
二、实验步骤1) 将基站同电脑用烧录线连接好,打开基站的开关,同时将基站的烧录开关拨上去。
2) 用串口线将基站和 PC 机器连接起来。
3) 打开串口助手。
4) 打开 Cygwin 开发环境。
5) 在 Cygwin 界面中执行 cd apps/Demos/Basic/ SerialDebug,进入到串口调试实验目录下。
6) 在串口调试代码目录下执行 make antc5 install,进行编译和烧录。
7) 烧录成功后,实验现象为串口有内容输出,输出内容如下:DEMO of Serial Debug1. This is a string, and this is char x2. NUM1: HEX=0x39, DEC=574.FLOAT:0x123.1234三、实验代码/**串口调试程序的实现模块@date*//* 定义调试级别,参加Makefile的ADBG_LEVEL定义,设置大于等于ADBG_LEVEL */#define DBG_LEV 3000#define DBG_LEV2 2000module SerialDebugM{uses interface Boot;}implementation{/** 任务: 通过串口打印信息来调试 */task void DebugSerial(){uint8_t num1 = 0x39;uint32_t num2 = 0x12345678;float float1 = 123.1234;/** ADBG,格式类似于printf,第一个参数为调试等级,可以参见tos/lib/common/antdebug.h*//** 打印字符和字符串 */ADBG(DBG_LEV, \\n\r\nDEMO of Serial Debug\r\n, 'x');ADBG(DBG_LEV, . This is a string, and this is char'%c'\r\n, 'x');/** 打印8位的数字 */ADBG(DBG_LEV, . NUM1: HEX=0x%x, DEC=%d\r\n,(int)(num1), (int)(num1));/** 打印32位数字 */ADBG(DBG_LEV2, . NUM2: HEX=0x%lx,DEC=%ld\r\n,(uint32_t)(num2), (uint32_t)(num2));/** 打印浮点数*/ADBG(DBG_LEV,. FLOAT: %f\r\n, float1);}/** 启动事件处理函数,在SerialDebug.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted(){post DebugSerial();}}实验四串口通信一、实验内容实现一个串口实验,在串口助手中实现回显的功能。
二、实验步骤1) 将基站同电脑用烧录线连接好,打开基站的开关。
2) 用串口线将基站和 PC 机器连接起来。
3) 打开串口助手。
4) 打开 Cygwin 开发环境。
5) 在 Cygwin 界面中执行 cd apps/Demos/Basic/ SerialIO,进入到串口通讯实验目录下。
6) 在串口通讯代码目录下执行 make antc5 install,进行编译和烧录。
7) 根据串口输出的提示进行操作,在串口助手的字符输入框输入 1,红灯会一直亮着,直到再一次输入 1 才熄灭;在串口助手的字符输入框输入 2,绿灯会一直亮着,直到再一次输入 1 才熄灭,输入其他数字串口会提示“Error key”,并且会显示你输入的数字,结果如下:Demo of Serio I/O[1]Toggle BLUE LED[2]Toggle YELLOW LEDYou choose to input 1You choose to Toggle BLUE LED三、实验代码/**串口输入输出程序的实现模块@author@date*/#include <strings.h>/** 定义此宏,将演示UartStream.receive函数,允许一次指定数量的数据 */ //#define SERIALIO_RECEIVE#define DBG_LEV 3000module SerialIoM{uses interface Boot;uses interface StdControl as UartStdControl;uses interface UartStream;}implementation{uint8_t m_receive_len;uint8_t m_echo_buf;uint8_t m_send_buf[100];/* 显示一个菜单提示用户 */void showMenu(){strcpy(m_send_buf, \\n\r\nDemo of Serio I/O\r\n[1]Toggle BLUE LED\r\n[2] Toggle YELLOW LED\r\n);/* 通过UartStream.send可以发送字节数据 */call UartStream.send(m_send_buf, strlen(m_send_buf));}/** 启动事件处理函数,在SerialIo.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted(){LED_BLUE_ON;LED_YELLOW_ON;call UartStdControl.start();showMenu();}async event void UartStream.sendDone(uint8_t *buf, uint16_t len, error_t error){}/** 重新发送刚才接收的字符进行回显 */task void showMenuTask(){showMenu();}task void lightLED(){if(m_echo_buf=='1'){LED_BLUE_TOGGLE; /* 切换蓝色LED灯 */ADBG(DBG_LEV, You choose to input%c\r\n,m_echo_buf);ADBG(DBG_LEV, You choose to toggle BLUE LED\r\n);post showMenuTask();}else if (m_echo_buf == '2'){LED_YELLOW_TOGGLE; /* 切换黄色LED灯 */ADBG(DBG_LEV, You choose to input%c\r\n,m_echo_buf);ADBG(DBG_LEV, You choose to toggle YELLOW LED\r\n);post showMenuTask();}else{ADBG(DBG_LEV, Error Key %c\r\n, m_echo_buf);post showMenuTask();}}/** 如果没有调用receive接收,则每接收到一个数据就会触发此事件 */ async event void UartStream.receivedByte(uint8_t byte){m_echo_buf = byte;post lightLED();}/** 在接收完receive命令欲接收的长度后会调用此事件 */async event void UartStream.receiveDone(uint8_t *buf,uint16_t len, error_t error){}}实验五 Flash读写一、实验内容Flash读写:自己定义一个结构体,并且将结构体的内容写入到 0x1fff8,并且在写完后将结构体的数据读取出来和原始数据进行比较。