




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机科学与技术学院、软件学院学生实验报告实验题目: 基于ATOS平台的物联网实验 学生姓名: 指导教师: 专业班级: 提交日期: 49 实验一 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;implemen
2、tation/* LED灯演示*/task void DemoLed()/* 目前节点上提供两个LED灯LED_BLUE -> 蓝灯LED_YELLOW -> 黄灯*/int i,j;while(1)for(i=0;i<1000;i+)for(j=0;j<500;j+);LED_BLUE_OFF; /* 熄灭蓝色LED灯 */LED_YELLOW_OFF; /* 点亮黄色LED灯 */for(i=0;i<1000;i+)for(j=0;j<500;j+);LED_BLUE_ON; /* 熄灭蓝色LED灯 */LED_YELLOW_OFF; /* 点亮黄色LE
3、D灯 */* 启动事件处理函数,在LED.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted()post DemoLed();1.4 实验截图1.5 实验心得通过这次实验,掌握了对 LED的简单控制,受益匪浅,并且对此次实验的运作过程开始了解。 实验二 定时器组件1.1 实验要求通过定时器让绿色灯闪烁,并且闪烁三次后停止闪烁。1.2 实验思路设置一个变量,在计时器每计数一次自加一次,加到三时,停止计时器。1.3 实验关键代码#define DBG_LEV 5module TimerLedMuses interface Boot;/* T
4、imer为系统接口TMilli指明了定时器的精度为毫秒 */uses interface Timer<TMilli> as Timer1; /* as关键字为接口别名 */uses interface Timer<TMilli> as Timer2;implementation/* 任务: 切换黄色LED灯 */int i=0;/* 启动事件处理函数,在TimerLed.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted()/* 定时器1: 持续工作,每隔1s触发一次 */call Timer1.startPer
5、iodic(1000);/* 定时器2: 持续工作,每隔3s触发一次*/call Timer2.startPeriodic(5000);/* 定时器1的事件处理函数 */event void Timer1.fired()/* 事件处理中直接切换蓝色LED灯 */ADBG(5, "led blue toggle.rn");/LED_BLUE_TOGGLE;ADBG(5, "led yellow toggle.rn");/post ToggleLedYellow();LED_YELLOW_TOGGLE;i=i+1;if(i=3) call Timer1.st
6、op(); /通过stop函数使定时器停止/* 定时器2的事件处理函数 */event void Timer2.fired()/ADBG(5, "led yellow toggle.rn");/post ToggleLedYellow();1.4 实验截图1.5 实验心得通过此次实验,加强了我对代码的思考,更加了解定时器函数的使用。实验三 串口调试1.1 实验要求通过级别控制,使得某些调试语句没有被输出到串口。1.2 实验思路默认的ADBG_LEV为3000,将语句中的DBG_LEV参数改为比默认的ADBG_LEV小即可1.3 实验关键代码/* 串口调试程序的实现模块dat
7、e */* 定义调试级别,参加Makefile的ADBG_LEVEL定义,设置大于等于ADBG_LEVEL */#define DBG_LEV3000module SerialDebugMuses interface Boot;implementation/* 任务: 通过串口打印信息来调试 */task void DebugSerial()uint8_t num1 = 0x39;uint32_t num2 = 0x12345678;float float1 = 123.1234;/* ADBG,格式类似于printf,第一个参数为调试等级,可以参见tos/lib/common/antdebu
8、g.h */* 打印字符和字符串 */ADBG(DBG_LEV, "rnrnDEMO of Serial Debugrn", 'x');ADBG(DBG_LEV, "1. This is a string, and this is char '%c'rn", 'x');/* 打印8位的数字 */ADBG(DBG_LEV, "2. NUM1: HEX=0x%x, DEC=%drn", (int)(num1), (int)(num1);/* 打印32位数字 */ADBG(2000, &quo
9、t;2. NUM2: HEX=0x%lx, DEC=%ldrn", (uint32_t)(num2), (uint32_t) (num2);/* 打印浮点数*/ADBG(DBG_LEV, "3. FLOAT: %frn", float1);/* 启动事件处理函数,在SerialDebug.nc已经关联到MainC.Boot接口系统启动后会调用此函数*/event void Boot.booted()post DebugSerial();1.4 实验截图图1 未屏蔽前图2 屏蔽后1.5 实验心得此次实验加深了我对串口的了解与使用,是一次非常好的实验材料,受益匪浅。实
10、验四 串口通信1.1 实验要求实现一个串口实验,在串口助手中实现回显的功能。(键盘键入的任何内容回车后显示在串口助手的终端)1.2 实验思路直接在原有的UartStream.receivedByte函数基础上修改,直接输出结果1.3 实验关键代码/* 串口输入输出程序的实现模块authordate */#include <strings.h>/* 定义此宏,将演示UartStream.receive函数,允许一次指定数量的数据 */#define SERIALIO_RECEIVE#define DBG_LEV3000module SerialIoMuses interface Bo
11、ot;uses interface StdControl as UartStdControl;uses interface UartStream;implementationuint8_t m_receive_len;uint8_t m_echo_buf;uint8_t m_send_buf100;/* 显示一个菜单提示用户 */void showMenu() strcpy(m_send_buf, "rnrnDemo of Serio I/Orn1 Toggle BLUE LEDrn2 Toggle YELLOW LEDrn");/* 通过UartStream.send可以
12、发送字节数据 */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)/* 重新发送刚才接收的字符进行回
13、显 */task void showMenuTask()showMenu();task 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.receivedByte(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
15、 实验截图1.5 实验心得通过这次实验,对串口通信的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。实验五 FLASH读写1.1 实验要求自己定义一个结构体,并且将结构体的内容写入到0x1fff8,并且在写完后将结构体的数据读取出来和原始数据进行比较。1.2 实验思路将原有代码的读写数组改成结构体中的数组即可1.3 实验关键代码/* 定义调试级别,参加Makefile的ADBG_LEVEL定义,设置大于等于ADBG_LEVEL */#define DBG_LEV3000module TestFlashCuses interface Boot;uses interfac
16、e HalFlash;implementation struct data uint8_t ieee38; uint8_t ieee48; ; struct data arr;task void initTask() uint8_t i; arr.ieee40=2; arr.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*)0x
17、1fff8);for (i=0; i < 8; i+=4)call HalFlash.write(uint8_t*)(0x1FFF8+i), (arr.ieee4+i), 4);call HalFlash.read(arr.ieee3, (uint8_t *)0x1FFF8, 8);ADBG(DBG_LEV, "read ok.n");for (i=0; i < sizeof(arr.ieee3); +i)ADBG(DBG_LEV, "arr.ieee3%d=%dn", (int)i, (int)arr.ieee3i);event void
18、Boot.booted()ADBG(DBG_LEV, "Boot.bootedn");post initTask();1.4 实验截图1.5 实验心得通过这次实验,对FlASH读写的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。实验六 点对点通信1.1 实验要求完成一个两跳点对点的传输,让基站给节点1发送一个消息,节点1在接收到消息后将自己的蓝灯状态改变,延迟1s后将消息继续传递给节点2,节点2在接收到消息后将自己的黄灯状态改变。1.2 实验思路1.3 实验关键代码基站节点 同节点2#define DBG_LEV 1000module P2PMu
19、ses interface Boot;interface AtosControl;interface StdControl as UartStdControl;interface UartStream;interface AMSend;interface Receive;interface AMPacket;interface Packet;implementationenumMAX_ADDRESS_LEN = 5,INPUT_ADDRESS = 0,INPUT_DATA = 1,;message_t m_msg;uint8_t m_len = 0;char m_address_strMAX_
20、ADDRESS_LEN = 0;uint8_t m_address_index = 0;uint8_t m_input_type = 0;/* 显示菜单*/task void showMenu()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.addres
21、s(),ADBG_N(TOS_IEEE_PANID);m_input_type = INPUT_ADDRESS;m_address_index = 0;/*将从串口输入的地址字符串转化为真实地址*/uint16_t getDestAddress()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 < m_address_index; +i)uint8_t digital = m_addres
22、s_stri;if(digital >= 'A' && digital <= 'F')digital = digital - 'A' + 10;else if(digital >= 'a' && digital <= 'f')digital = digital - 'a' + 10;else if(digital >= '0' && digital <= '9')digital = d
23、igital - '0'address = address*16 +digital;return address;/* 发送数据*/task void sendData()uint8_t i;uint8_t* payload = call Packet.getPayload(&m_msg, NULL);uint16_t address = call AMPacket.address();uint16_t dest_address = getDestAddress();ADBG_APP( "rnrn* Sending . from %d, to %d, len=
24、%drn",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len);call AMSend.send(dest_address, &m_msg, m_len);/LED_BLUE_TOGGLE;/*发送完处理*/event void AMSend.sendDone(message_t* msg, error_t result)/ADBG_APP( "send donen");ADBG_APP( "* Sent%s!rn", (result = SUCCESS) ? "OK"
25、; : "FAIL");if (result = SUCCESS)LED_BLUE_TOGGLE;elseLED_YELLOW_TOGGLE;m_len = 0;m_input_type = INPUT_ADDRESS;post showMenu();/* 节点启动完毕*/event void Boot.booted()/*开启射频*/call AtosControl.start();/*开启串口通信*/call UartStdControl.start();LED_YELLOW_OFF;LED_BLUE_OFF;ADBG_APP( "rn#rn");A
26、DBG_APP( " P2PDEMO My Address = 0x%x, Group = 0x%xrn", ADBG_N(call AMPacket.address(), ADBG_N(TOS_IEEE_PANID);ADBG_APP( "#rn");m_input_type = INPUT_ADDRESS;post showMenu();/*从串口接收数据*/async event void UartStream.receivedByte(uint8_t c)if(c != 'r')if (m_input_type = INPUT_D
27、ATA)/*输入数据*/uint8_t* payload = (uint8_t*)call Packet.getPayload(&m_msg, NULL);if(m_len >= call Packet.maxPayloadLength()return;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_a
28、ddress_index+ = c;ADBG_APP( "%c", c);if(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,
29、uint16_t len, error_t error)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;ADBG_APP( "rn*Receive, len = %d, DATA:rn", ADBG_N(len);for(i=0; i < len; i+)ADBG_
30、APP( "%c", (uint8_t*)payload)i);ADBG_APP( "rn");LED_YELLOW_TOGGLE;m_input_type = INPUT_ADDRESS;节点1:(P2PC中添加Timer1的定时器声明)configuration P2PCimplementationcomponents P2PM;components MainC;P2PM.Boot -> MainC.Boot;/* 串口收发组件*/components PlatformSerialC;P2PM.UartStdControl -> Plat
31、formSerialC;P2PM.UartStream -> PlatformSerialC;/*活动消息组件*/ components new PlatformMacC(123);components AtosMacC;P2PM.AtosControl -> AtosMacC;P2PM.AMPacket -> PlatformMacC;P2PM.Packet -> PlatformMacC;P2PM.AMSend -> PlatformMacC;P2PM.Receive ->PlatformMacC;components new TimerMilliC()
32、 as Timer1;P2PM.Timer1 -> Timer1; / 添加Timer1的定时器声明#define DBG_LEV 1000module P2PMuses interface Boot;interface AtosControl;interface StdControl as UartStdControl;interface UartStream;interface AMSend;interface Receive;interface AMPacket;interface Packet;interface Timer<TMilli> as Timer1; im
33、plementationenumMAX_ADDRESS_LEN = 5,INPUT_ADDRESS = 0,INPUT_DATA = 1,;message_t m_msg;uint8_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 showMenu()if( m_input_type = INPUT_DATA)/*等待输入欲发送的数据*/ADBG_APP( "rn* To Send:rn&q
34、uot;);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 getDestAddress()uint16_t address = 0;uint8_t i = 0;if(m_address_i
35、ndex > MAX_ADDRESS_LEN)m_address_index = MAX_ADDRESS_LEN -1;for ( i=0; i < m_address_index; +i)uint8_t digital = m_address_stri;if(digital >= 'A' && digital <= 'F')digital = digital - 'A' + 10;else if(digital >= 'a' && digital <= '
36、;f')digital = digital - 'a' + 10;else if(digital >= '0' && digital <= '9')digital = digital - '0'address = address*16 +digital;return address;/* 发送数据*/task void sendData()uint8_t i;uint8_t* payload = call Packet.getPayload(&m_msg, NULL);uint16_t
37、address = call AMPacket.address();uint16_t dest_address = getDestAddress();ADBG_APP( "rnrn* Sending . from %d, to %d, len=%drn",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len);call AMSend.send(dest_address, &m_msg, m_len);/LED_BLUE_TOGGLE;task void sendData1()/* 节点1发送数据*/uint8_t i;u
38、int8_t* payload = call Packet.getPayload(&m_msg, NULL);uint16_t address = call AMPacket.address();uint16_t dest_address = 03;/目的地址为3ADBG_APP( "rnrn* Sending . from %d, to %d, len=%drn",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len);call AMSend.send(dest_address, &m_msg, m_len);
39、/LED_BLUE_TOGGLE;/*发送完处理*/event void AMSend.sendDone(message_t* msg, error_t result)/ADBG_APP( "send donen");ADBG_APP( "* Sent%s!rn", (result = SUCCESS) ? "OK" : "FAIL");if (result = SUCCESS)LED_BLUE_TOGGLE;elseLED_YELLOW_TOGGLE;m_len = 0;m_input_type = INPUT_
40、ADDRESS;post showMenu();/* 节点启动完毕*/event void Boot.booted()/*开启射频*/call AtosControl.start();/*开启串口通信*/call UartStdControl.start();LED_YELLOW_OFF;LED_BLUE_OFF;ADBG_APP( "rn#rn");ADBG_APP( " P2PDEMO My Address = 0x%x, Group = 0x%xrn", ADBG_N(call AMPacket.address(), ADBG_N(TOS_IEEE
41、_PANID);ADBG_APP( "#rn");m_input_type = INPUT_ADDRESS;post showMenu();/*从串口接收数据*/async event void UartStream.receivedByte(uint8_t c)if(c != 'r')if (m_input_type = INPUT_DATA)/*输入数据*/uint8_t* payload = (uint8_t*)call Packet.getPayload(&m_msg, NULL);if(m_len >= call Packet.max
42、PayloadLength()return;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+ = c;ADBG_APP( "%c", c);if(m_address_index < MAX_ADDRESS_LEN)return;/*按下回车键或者到达最大长度,则处
43、理*/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)async event void UartStream.receiveDone(uint8_t* buf, uint16_t len, error_t error)/*
44、射频接收数据*/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_T
45、OGGLE;m_input_type = INPUT_ADDRESS;/*定时器事件处理函数*/event void Timer1.fired() /定时器结束后执行post sendData1();/给节点2发送数据call Timer1.stop();1.4 实验截图1.5 实验心得通过这次实验,对点对点的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。对于延时发送可以通过定时器来实现也更为熟悉。实验七 射频广播1.1 实验要求写一个射频广播实验,包括基站和两个节点的程序。使得两个节点在接收到基站的三个广播信号停止接收广播数据。1.2 实验思路添加全局变量,每次广
46、播成功变量自减一次,判断是否为0,为0时停止广播。1.3 实验关键代码#define DBG_LEV 1000module BroadcastPuses interface Boot;interface AtosControl;interface AMSend;interface Receive;interface AMPacket;interface Packet;interface Timer<TMilli> as SensorTimer;implementationmessage_t m_msg;int i = 3;/定义控制广播次数的参数/* 发送数据*/task void
47、 sendData()uint16_t m_len = 0x00;uint8_t* payload = call Packet.getPayload(&m_msg, NULL);uint16_t address = call AMPacket.address();*payload = 0x01;m_len = 0x01;if (address = 0x01)call AMSend.send(0xFFFF, &m_msg, m_len);LED_BLUE_TOGGLE;/*发送完处理*/event void AMSend.sendDone(message_t* msg, erro
48、r_t success)/* 节点启动完毕*/event void Boot.booted()/*开启射频*/call AtosControl.start();LED_YELLOW_ON;LED_BLUE_ON;call SensorTimer.startPeriodic(1000);event void SensorTimer.fired()post sendData();/*射频接收数据*/event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)LED_BLUE_TOGGLE;i = i - 1;if(i=0) call AtosControl.stop();/每次广播完成后自减1,减到0时停止广播1.4 实验心得通过这次实验,对射频广播的原理有了大致的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东中山市教体系统事业单位第四期招聘事业单位人员79人考前自测高频考点模拟试题及一套答案详解
- 2025年安庆职业技术学院招聘33人考前自测高频考点模拟试题及1套参考答案详解
- 2025年度海原县农业农村局公开招聘基层农技推广体系改革与建设项目特聘农技员(防疫员)招聘考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025年潍坊护理职业学院公开招聘控制总量工作人员(30人)模拟试卷及答案详解1套
- 2025广东肇庆市广宁县退役军人事务局招聘临聘人员1人考前自测高频考点模拟试题参考答案详解
- 2025福建莆田市荔城区事业单位定向招考未就业随军家属1人模拟试卷及答案详解(名师系列)
- 2025年福建省福州市少年儿童图书馆招聘3人模拟试卷及一套参考答案详解
- 2025湖北恩施州巴东水之星体育文化发展有限公司招聘模拟试卷及答案详解(典优)
- 祖国的园子课件
- 2025年德州平原县县属国有企业公开招聘工作人员模拟试卷完整答案详解
- 艺人独家经纪合同(标准版)
- 2025年肺功能证考试题及答案
- 2026中国海洋石油集团有限公司秋季校园招聘备考考试题库附答案解析
- 2025年及未来5年中国羊奶粉行业市场调研分析及投资战略咨询报告
- 学校物业委托管理服务合同7篇
- 2025-2026学年人教版二年级上册数学第三单元测试卷(含答案)(三套)
- 《守望成长法治护航》法制教育主题班会
- 桡骨骨折课件教学
- 2025年特种作业类冶金煤气作业理论知识-理论知识参考题库含答案解析(5卷)
- 2025-2030中国节能玻璃材料市场发展动态及竞争格局研究报告
- 数据标注课件
评论
0/150
提交评论