1、计算机科学与技术学院、软件学院学生实验报告实验题目: 基于 ATOS 平台的物联网实验 学生姓名: 指导教师: 专业班级: 提交日期: 2实验一 LED 组件1.1 实验要求绿灯一直处于熄灭的状态,红灯不停闪烁(注意:工具箱提供的代码有bug,对于基站节点LED_BLUE - 红灯 LED_YELLOW - 绿灯 ON和OFF逻辑相反)1.2 实验思路将绿灯状态改为 OFF,红灯通过时间延迟控制其的亮灭。1.3 实验关键代码/*LED 示例程序的实现模块,简单的点亮 3 个 LED 灯date 2010-1*/module LedMuses interface Boot;implementat
2、ion/* LED 灯演示*/task void DemoLed()/* 目前节点上提供两个 LED 灯LED_BLUE - 蓝灯LED_YELLOW - 黄灯*/int i,j;while(1)for(i=0;i as Timer1; /* as 关键字为接口别名 */uses interface Timer as Timer2;implementation/* 任务: 切换黄色 LED 灯 */int i=0;/* 启动事件处理函数,在 TimerLed.nc 已经关联到 MainC.Boot 接口系统启动后会调用此函数*/event void Boot.booted()/* 定时器 1:
3、 持续工作,每隔 1s 触发一次 */call Timer1.startPeriodic(1000);/* 定时器 2: 持续工作,每隔 3s 触发一次*/call Timer2.startPeriodic(5000);/* 定时器 1 的事件处理函数 */event void Timer1.fired()/* 事件处理中直接切换蓝色 LED 灯 */6/ADBG(5, “led blue toggle.rn“);/LED_BLUE_TOGGLE;ADBG(5, “led yellow toggle.rn“);/post ToggleLedYellow();LED_YELLOW_TOGGLE;
4、i=i+1;if(i=3) call Timer1.stop(); /通过 stop 函数使定时器停止/* 定时器 2 的事件处理函数 */event void Timer2.fired()/ADBG(5, “led yellow toggle.rn“);/post ToggleLedYellow();71.4 实验截图1.5 实验心得通过此次实验,加强了我对代码的思考,更加了解定时器函数的使用。8实验三 串口调试1.1 实验要求通过级别控制,使得某些调试语句没有被输出到串口。1.2 实验思路默认的 ADBG_LEV 为 3000,将语句中的 DBG_LEV 参数改为比默认的ADBG_LEV
5、小即可1.3 实验关键代码/*串口调试程序的实现模块date */* 定义调试级别,参加 Makefile 的 ADBG_LEVEL 定义,设置大于等于ADBG_LEVEL */#define DBG_LEV 3000module SerialDebugMuses interface Boot;implementation/* 任务: 通过串口打印信息来调试 */task void DebugSerial()uint8_t num1 = 0x39;uint32_t num2 = 0x12345678;float float1 = 123.1234;/* ADBG,格式类似于 printf,第一
6、个参数为调试等级,可以参见 tos/lib/common/antdebug.h */9/* 打印字符和字符串 */ADBG(DBG_LEV, “rnrnDEMO of Serial Debugrn“, x);ADBG(DBG_LEV, “1. This is a string, and this is char %crn“, x);/* 打印 8 位的数字 */ADBG(DBG_LEV, “2. NUM1: HEX=0x%x, DEC=%drn“, (int)(num1), (int)(num1);/* 打印 32 位数字 */ADBG(2000, “2. NUM2: HEX=0x%lx, D
7、EC=%ldrn“, (uint32_t)(num2), (uint32_t) (num2);/* 打印浮点数*/ADBG(DBG_LEV, “3. FLOAT: %frn“, float1);/* 启动事件处理函数,在 SerialDebug.nc 已经关联到 MainC.Boot 接口系统启动后会调用此函数*/event void Boot.booted()post DebugSerial();101.4 实验截图图 1 未屏蔽前11图 2 屏蔽后1.5 实验心得此次实验加深了我对串口的了解与使用,是一次非常好的实验材料,受益匪浅。实验四 串口通信121.1 实验要求实现一个串口实验,在串
8、口助手中实现回显的功能。(键盘键入的任何内容回车后显示在串口助手的终端)1.2 实验思路直接在原有的 UartStream.receivedByte 函数基础上修改,直接输出结果1.3 实验关键代码/*串口输入输出程序的实现模块authordate */#include /* 定义此宏,将演示 UartStream.receive 函数,允许一次指定数量的数据 */#define SERIALIO_RECEIVE#define DBG_LEV 3000module SerialIoMuses interface Boot;uses interface StdControl as UartStd
9、Control;uses interface UartStream;implementationuint8_t m_receive_len;uint8_t m_echo_buf;uint8_t m_send_buf100;/* 显示一个菜单提示用户 */void showMenu() 13strcpy(m_send_buf, “rnrnDemo of Serio I/Orn1 Toggle BLUE LEDrn2 Toggle YELLOW LEDrn“);/* 通过 UartStream.send 可以发送字节数据 */call UartStream.send(m_send_buf, str
10、len(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();ta
11、sk void lightLED()if(m_echo_buf=1)LED_BLUE_TOGGLE; /* 切换蓝色 LED 灯 */ADBG(DBG_LEV, “You choose to toggle BLUE LEDrn“);else if (m_echo_buf = 2)LED_YELLOW_TOGGLE; /* 切换黄色 LED 灯 */ADBG(DBG_LEV, “You choose to toggle YELLOW LEDrn“);14/* 如果没有调用 receive 接收,则每接收到一个数据就会触发此事件 */async event void UartStream.rece
12、ivedByte(uint8_t byte)m_echo_buf = byte;ADBG(DBG_LEV, “%cr“,m_echo_buf); /将 byte 直接输出post lightLED(); /* 在接收完 receive 命令欲接收的长度后会调用此事件 */async event void UartStream.receiveDone(uint8_t *buf, uint16_t len, error_t error)1.4 实验截图151.5 实验心得通过这次实验,对串口通信的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。16实验五 FLASH 读写
13、1.1 实验要求自己定义一个结构体,并且将结构体的内容写入到 0x1fff8,并且在写完后将结构体的数据读取出来和原始数据进行比较。1.2 实验思路将原有代码的读写数组改成结构体中的数组即可1.3 实验关键代码/* 定义调试级别,参加 Makefile 的 ADBG_LEVEL 定义,设置大于等于ADBG_LEVEL */#define DBG_LEV 3000module TestFlashCuses interface Boot;uses interface HalFlash;implementationstruct datauint8_t ieee38;uint8_t ieee48;st
14、ruct data arr;task void initTask() uint8_t i;arr.ieee40=2;17arr.ieee41=2;arr.ieee42=3;arr.ieee43=3;arr.ieee44=4;arr.ieee45=4;arr.ieee46=5;arr.ieee47=5;ADBG(DBG_LEV, “read now n“);call HalFlash.erase(uint8_t*)0x1fff8);for (i=0; i MAX_ADDRESS_LEN)m_address_index = MAX_ADDRESS_LEN -1;for ( i=0; i = A p
15、ayloadm_len+ = c;ADBG_APP( “%c“, c);if(m_len MainC.Boot;/* 串口收发组件*/components PlatformSerialC;P2PM.UartStdControl - PlatformSerialC;P2PM.UartStream - PlatformSerialC;25/*活动消息组件*/components new PlatformMacC(123);components AtosMacC;P2PM.AtosControl - AtosMacC;P2PM.AMPacket - PlatformMacC;P2PM.Packet
16、- PlatformMacC;P2PM.AMSend - PlatformMacC;P2PM.Receive -PlatformMacC;components new TimerMilliC() as Timer1;P2PM.Timer1 - Timer1; / 添加 Timer1 的定时器声明#define DBG_LEV 1000module P2PMuses interface Boot;interface AtosControl;interface StdControl as UartStdControl;interface UartStream;interface AMSend;in
17、terface Receive;interface AMPacket;interface Packet;interface Timer as Timer1;implementationenumMAX_ADDRESS_LEN = 5,INPUT_ADDRESS = 0,INPUT_DATA = 1,;message_t m_msg;26uint8_t m_len = 0;char m_address_strMAX_ADDRESS_LEN = 0;uint8_t m_address_index = 0;uint8_t m_input_type = 0;/* 显示菜单*/task void show
18、Menu()if( m_input_type = INPUT_DATA)/*等待输入欲发送的数据*/ADBG_APP( “rn* To Send:rn“);else/*等待输入欲发送的地址*/ADBG_APP( “rn# rn* MY NodeId = 0x%x, Group=0x%x, destination ?rn“,ADBG_N(call AMPacket.address(),ADBG_N(TOS_IEEE_PANID);m_input_type = INPUT_ADDRESS;m_address_index = 0;/*将从串口输入的地址字符串转化为真实地址 */uint16_t ge
19、tDestAddress()uint16_t address = 0;uint8_t i = 0;if(m_address_index MAX_ADDRESS_LEN)m_address_index = MAX_ADDRESS_LEN -1;for ( i=0; i = A payloadm_len+ = c;ADBG_APP( “%c“, c);if(m_len call Packet.maxPayloadLength()return;else/*输入地址*/if(m_address_index MAX_ADDRESS_LEN)m_address_strm_address_index+ =
20、c;ADBG_APP( “%c“, c);30if(m_address_index MAX_ADDRESS_LEN)return;/*按下回车键或者到达最大长度,则处理*/if(m_input_type = INPUT_DATA)post sendData();else/*地址处理完毕,准备输入数据*/m_input_type = INPUT_DATA;post showMenu();/* 实现接口 UartStream 接口中的事件*/async event void UartStream.sendDone(uint8_t* buf, uint16_t len, error_t error)
21、async event void UartStream.receiveDone(uint8_t* buf, uint16_t len, error_t error)/*射频接收数据*/event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)uint8_t i;call Timer1.startPeriodic(1000);ADBG_APP( “rn*Receive, len = %d, DATA:rn“, ADBG_N(len);for(i=0; i len; i+)ADBG_APP( “%c“, (uint8_t*)payload)i);ADBG_APP( “rn“);LED_YELLOW_TOGGLE;