AOTS实验报告材料_第1页
AOTS实验报告材料_第2页
AOTS实验报告材料_第3页
AOTS实验报告材料_第4页
AOTS实验报告材料_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wordword73/73word计算机科学与技术学院、软件学院学生实验报告实验题目:基于ATOS平台的物联网实验学生某某:指导教师:专业班级:提交日期:实验一LED组件实验要求绿灯一直处于熄灭的状态,红灯不停闪烁〔注意:工具箱提供的代码有bug,对于基站节点LED_BLUE->红灯LED_YELLOW->绿灯ON和OFF逻辑相反〕实验思路将绿灯状态改为OFF,红灯通过时间延迟控制其的亮灭。实验关键代码/**LED示例程序的实现模块,简单的点亮3个LED灯date2010-1*/moduleLedM{usesinterfaceBoot;}implementation{/**LED灯演示*/taskvoidDemoLed(){/**目前节点上提供两个LED灯LED_BLUE->蓝灯LED_YELLOW->黄灯*/inti,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;/*点亮黄色LED灯*/}}系统启动后会调用此函数*/eventvoidBoot.booted(){postDemoLed();}}实验截图实验心得通过这次实验,掌握了对LED的简单控制,受益匪浅,并且对此次实验的运作过程开始了解。实验二定时器组件实验要求通过定时器让绿色灯闪烁,并且闪烁三次后停止闪烁。实验思路设置一个变量,在计时器每计数一次自加一次,加到三时,停止计时器。实验关键代码#defineDBG_LEV5moduleTimerLedM{usesinterfaceBoot;/*Timer为系统接口TMilli指明了定时器的精度为毫秒*/usesinterfaceTimer<TMilli>asTimer1;/*as关键字为接口别名*/usesinterfaceTimer<TMilli>asTimer2;}implementation{/**任务:切换黄色LED灯*/inti=0;系统启动后会调用此函数*/eventvoidBoot.booted(){/**定时器1:持续工作,每隔1s触发一次*/callTimer1.startPeriodic(1000);/**定时器2:持续工作,每隔3s触发一次*///callTimer2.startPeriodic(5000);}/**定时器1的事件处理函数*/eventvoidTimer1.fired(){/**事件处理中直接切换蓝色LED灯*///ADBG(5,"ledbluetoggle.\r\n");//LED_BLUE_TOGGLE;ADBG(5,"ledyellowtoggle.\r\n");//postToggleLedYellow();LED_YELLOW_TOGGLE;i=i+1;if(i==3)callTimer1.stop();//通过stop函数使定时器停止}/**定时器2的事件处理函数*/eventvoidTimer2.fired(){//ADBG(5,"ledyellowtoggle.\r\n");//postToggleLedYellow();}}实验截图实验心得通过此次实验,加强了我对代码的思考,更加了解定时器函数的使用。实验三串口调试实验要求通过级别控制,使得某些调试语句没有被输出到串口。实验思路默认的ADBG_LEV为3000,将语句中的DBG_LEV参数改为比默认的ADBG_LEV小即可实验关键代码/**串口调试程序的实现模块date*//*定义调试级别,参加Makefile的ADBG_LEVEL定义,设置大于等于ADBG_LEVEL*/#defineDBG_LEV3000moduleSerialDebugM{usesinterfaceBoot;}implementation{/**任务:通过串口打印信息来调试*/taskvoidDebugSerial(){uint8_tnum1=0x39;uint32_tnum2=0x12345678;floatfloat1=123.1234;/**ADBG,格式类似于printf,第一个参数为调试等级,可以参见tos/lib/mon/antdebug.h*//**打印字符和字符串*/ADBG(DBG_LEV,"\r\n\r\nDEMOofSerialDebug\r\n",'x');ADBG(DBG_LEV,"1.Thisisastring,andthisischar'%c'\r\n",'x');/**打印8位的数字*/ADBG(DBG_LEV,"2.NUM1:HEX=0x%x,DEC=%d\r\n",(int)(num1),(int)(num1));/**打印32位数字*/ADBG(2000,"2.NUM2:HEX=0x%lx,DEC=%ld\r\n",(uint32_t)(num2),(uint32_t)(num2));/**打印浮点数*/ADBG(DBG_LEV,"3.FLOAT:%f\r\n",float1);}系统启动后会调用此函数*/eventvoidBoot.booted(){postDebugSerial();}}实验截图图1未屏蔽前图2屏蔽后实验心得此次实验加深了我对串口的了解与使用,是一次非常好的实验材料,受益匪浅。实验四串口通信实验要求实现一个串口实验,在串口助手中实现回显的功能。(键盘键入的任何内容回车后显示在串口助手的终端)实验思路直接在原有的函数根底上修改,直接输出结果实验关键代码/**串口输入输出程序的实现模块authordate*/#include<strings.h>/**定义此宏,将演示UartStream.receive函数,允许一次指定数量的数据*///#defineSERIALIO_RECEIVE#defineDBG_LEV3000moduleSerialIoM{usesinterfaceBoot;usesinterfaceStdControlasUartStdControl;usesinterfaceUartStream;}implementation{uint8_tm_receive_len;uint8_tm_echo_buf;uint8_tm_send_buf[100];/*显示一个菜单提示用户*/voidshowMenu(){strcpy(m_send_buf,"\r\n\r\nDemoofSerioI/O\r\n[1]ToggleBLUELED\r\n[2]ToggleYELLOWLED\r\n");/*通过UartStream.send可以发送字节数据*/callUartStream.send(m_send_buf,strlen(m_send_buf));}系统启动后会调用此函数*/eventvoidBoot.booted(){LED_BLUE_ON;LED_YELLOW_ON;callUartStdControl.start();showMenu();}asynceventvoidUartStream.sendDone(uint8_t*buf,uint16_tlen,error_terror){}/**重新发送刚刚接收的字符进展回显*/taskvoidshowMenuTask(){showMenu();}taskvoidlightLED(){if(m_echo_buf=='1'){LED_BLUE_TOGGLE;/*切换蓝色LED灯*/ADBG(DBG_LEV,"YouchoosetotoggleBLUELED\r\n");}elseif(m_echo_buf=='2'){LED_YELLOW_TOGGLE;/*切换黄色LED灯*/ADBG(DBG_LEV,"YouchoosetotoggleYELLOWLED\r\n");}}/**如果没有调用receive接收,如此每接收到一个数据就会触发此事件*/asynceventvoidUartStream.receivedByte(uint8_tbyte){m_echo_buf=byte;ADBG(DBG_LEV,"%c\r",m_echo_buf);//将byte直接输出postlightLED();}/**在接收完receive命令欲接收的长度后会调用此事件*/asynceventvoidUartStream.receiveDone(uint8_t*buf,uint16_tlen,error_terror){}}实验截图实验心得通过这次实验,对串口通信的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。实验五FLASH读写实验要求自己定义一个结构体,并且将结构体的内容写入到0x1fff8,并且在写完后将结构体的数据读取出来和原始数据进展比拟。实验思路将原有代码的读写数组改成结构体中的数组即可实验关键代码/*定义调试级别,参加Makefile的ADBG_LEVEL定义,设置大于等于ADBG_LEVEL*/#defineDBG_LEV3000moduleTestFlashC{usesinterfaceBoot;usesinterfaceHalFlash;}implementation{structdata{uint8_tieee3[8];uint8_tieee4[8];};structdataarr;taskvoidinitTask(){uint8_ti;arr.ieee4[0]=2;arr.ieee4[1]=2;arr.ieee4[2]=3;arr.ieee4[3]=3;arr.ieee4[4]=4;arr.ieee4[5]=4;arr.ieee4[6]=5;arr.ieee4[7]=5;ADBG(DBG_LEV,"readnow\n");callHalFlash.erase((uint8_t*)0x1fff8);for(i=0;i<8;i+=4){callHalFlash.write((uint8_t*)(0x1FFF8+i),(arr.ieee4+i),4);}callHalFlash.read(arr.ieee3,(uint8_t*)0x1FFF8,8);ADBG(DBG_LEV,"readok.\n");for(i=0;i<sizeof(arr.ieee3);++i){ADBG(DBG_LEV,"arr.ieee3[%d]=%d\n",(int)i,(int)arr.ieee3[i]);}}eventvoidBoot.booted(){ADBG(DBG_LEV,"Boot.booted\n");postinitTask();}}实验截图实验心得通过这次实验,对FlASH读写的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。实验六点对点通信实验要求完成一个两跳点对点的传输,让基站给节点1发送一个消息,节点1在接收到消息后将自己的蓝灯状态改变,延迟1s后将消息继续传递给节点2,节点2在接收到消息后将自己的黄灯状态改变。实验思路实验关键代码基站节点同节点2#defineDBG_LEV1000moduleP2PM{uses{interfaceBoot;interfaceAtosControl;interfaceStdControlasUartStdControl;interfaceUartStream;interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;}}implementation{enum{MAX_ADDRESS_LEN=5,INPUT_ADDRESS=0,INPUT_DATA=1,};message_tm_msg;uint8_tm_len=0;charm_address_str[MAX_ADDRESS_LEN]={0};uint8_tm_address_index=0;uint8_tm_input_type=0;/*显示菜单*/taskvoidshowMenu(){if(m_input_type==INPUT_DATA){/*等待输入欲发送的数据*/ADBG_APP("\r\n*ToSend:\r\n");}else{/*等待输入欲发送的地址*/ADBG_APP("\r\n###################################################\r\n*MYNodeId=0x%x,Group=0x%x,destination?\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));m_input_type=INPUT_ADDRESS;m_address_index=0;}}/*将从串口输入的地址字符串转化为真实地址*/uint16_tgetDestAddress(){uint16_taddress=0;uint8_ti=0;if(m_address_index>MAX_ADDRESS_LEN){m_address_index=MAX_ADDRESS_LEN-1;}for(i=0;i<m_address_index;++i){uint8_tdigital=m_address_str[i];if(digital>='A'&&digital<='F'){digital=digital-'A'+10;}elseif(digital>='a'&&digital<='f'){digital=digital-'a'+10;}elseif(digital>='0'&&digital<='9'){digital=digital-'0';}address=address*16+digital;}returnaddress;}/*发送数据*/taskvoidsendData(){uint8_ti;uint8_t*payload=callPacket.getPayload(&m_msg,NULL);uint16_taddress=callAMPacket.address();uint16_tdest_address=getDestAddress();ADBG_APP("\r\n\r\n*Sending...from[%d],to[%d],len=[%d]\r\n",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len));callAMSend.send(dest_address,&m_msg,m_len);//LED_BLUE_TOGGLE;}/*发送完处理*/eventvoidAMSend.sendDone(message_t*msg,error_tresult){//ADBG_APP("senddone\n");ADBG_APP("*Sent%s!\r\n",(result==SUCCESS)?"OK":"FAIL");if(result==SUCCESS){LED_BLUE_TOGGLE;}else{LED_YELLOW_TOGGLE;}m_len=0;m_input_type=INPUT_ADDRESS;postshowMenu();}/*节点启动完毕*/eventvoidBoot.booted(){/*开启射频*/callAtosControl.start();/*开启串口通信*/callUartStdControl.start();LED_YELLOW_OFF;LED_BLUE_OFF;ADBG_APP("\r\n###############################################\r\n");ADBG_APP("[P2PDEMO]MyAddress=0x%x,Group=0x%x\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));ADBG_APP("###############################################\r\n");m_input_type=INPUT_ADDRESS;postshowMenu();}/*从串口接收数据*/asynceventvoidUartStream.receivedByte(uint8_tc){if(c!='\r'){if(m_input_type==INPUT_DATA){/*输入数据*/uint8_t*payload=(uint8_t*)callPacket.getPayload(&m_msg,NULL);if(m_len>=callPacket.maxPayloadLength()){return;}payload[m_len++]=c;ADBG_APP("%c",c);if(m_len<callPacket.maxPayloadLength()){return;}}else{/*输入地址*/if(m_address_index<MAX_ADDRESS_LEN){m_address_str[m_address_index++]=c;ADBG_APP("%c",c);}if(m_address_index<MAX_ADDRESS_LEN){return;}}}/*按下回车键或者到达最大长度,如此处理*/if(m_input_type==INPUT_DATA){postsendData();}else{/*地址处理完毕,准备输入数据*/m_input_type=INPUT_DATA;postshowMenu();}}/**实现接口UartStream接口中的事件*/asynceventvoidUartStream.sendDone(uint8_t*buf,uint16_tlen,error_terror){}asynceventvoidUartStream.receiveDone(uint8_t*buf,uint16_tlen,error_terror){}/*射频接收数据*/eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){uint8_ti;ADBG_APP("\r\n*Receive,len=[%d],DATA:\r\n",ADBG_N(len));for(i=0;i<len;i++){ADBG_APP("%c",((uint8_t*)payload)[i]);}ADBG_APP("\r\n");LED_YELLOW_TOGGLE;m_input_type=INPUT_ADDRESS;}}节点1:(P2PC中添加Timer1的定时器声明)configurationP2PC{}implementation{ponentsP2PM;ponentsMainC;P2PM.Boot->MainC.Boot;/*串口收发组件*/ponentsPlatformSerialC;P2PM.UartStdControl->PlatformSerialC;P2PM.UartStream->PlatformSerialC;/*活动消息组件*/ponentsnewPlatformMacC(123);ponentsAtosMacC;P2PM.AtosControl->AtosMacC;P2PM.AMPacket->PlatformMacC;P2PM.Packet->PlatformMacC;P2PM.AMSend->PlatformMacC;P2PM.Receive->PlatformMacC;ponentsnewTimerMilliC()asTimer1;P2PM.Timer1->Timer1;//添加Timer1的定时器声明}#defineDBG_LEV1000moduleP2PM{uses{interfaceBoot;interfaceAtosControl;interfaceStdControlasUartStdControl;interfaceUartStream;interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;interfaceTimer<TMilli>asTimer1;}}implementation{enum{MAX_ADDRESS_LEN=5,INPUT_ADDRESS=0,INPUT_DATA=1,};message_tm_msg;uint8_tm_len=0;charm_address_str[MAX_ADDRESS_LEN]={0};uint8_tm_address_index=0;uint8_tm_input_type=0;/*显示菜单*/taskvoidshowMenu(){if(m_input_type==INPUT_DATA){/*等待输入欲发送的数据*/ADBG_APP("\r\n*ToSend:\r\n");}else{/*等待输入欲发送的地址*/ADBG_APP("\r\n###################################################\r\n*MYNodeId=0x%x,Group=0x%x,destination?\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));m_input_type=INPUT_ADDRESS;m_address_index=0;}}/*将从串口输入的地址字符串转化为真实地址*/uint16_tgetDestAddress(){uint16_taddress=0;uint8_ti=0;if(m_address_index>MAX_ADDRESS_LEN){m_address_index=MAX_ADDRESS_LEN-1;}for(i=0;i<m_address_index;++i){uint8_tdigital=m_address_str[i];if(digital>='A'&&digital<='F'){digital=digital-'A'+10;}elseif(digital>='a'&&digital<='f'){digital=digital-'a'+10;}elseif(digital>='0'&&digital<='9'){digital=digital-'0';}address=address*16+digital;}returnaddress;}/*发送数据*/taskvoidsendData(){uint8_ti;uint8_t*payload=callPacket.getPayload(&m_msg,NULL);uint16_taddress=callAMPacket.address();uint16_tdest_address=getDestAddress();ADBG_APP("\r\n\r\n*Sending...from[%d],to[%d],len=[%d]\r\n",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len));callAMSend.send(dest_address,&m_msg,m_len);//LED_BLUE_TOGGLE;}taskvoidsendData1()/*节点1发送数据*/{uint8_ti;uint8_t*payload=callPacket.getPayload(&m_msg,NULL);uint16_taddress=callAMPacket.address();uint16_tdest_address=03;//目的地址为3ADBG_APP("\r\n\r\n*Sending...from[%d],to[%d],len=[%d]\r\n",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len));callAMSend.send(dest_address,&m_msg,m_len);//LED_BLUE_TOGGLE;}/*发送完处理*/eventvoidAMSend.sendDone(message_t*msg,error_tresult){//ADBG_APP("senddone\n");ADBG_APP("*Sent%s!\r\n",(result==SUCCESS)?"OK":"FAIL");if(result==SUCCESS){LED_BLUE_TOGGLE;}else{LED_YELLOW_TOGGLE;}m_len=0;m_input_type=INPUT_ADDRESS;postshowMenu();}/*节点启动完毕*/eventvoidBoot.booted(){/*开启射频*/callAtosControl.start();/*开启串口通信*/callUartStdControl.start();LED_YELLOW_OFF;LED_BLUE_OFF;ADBG_APP("\r\n###############################################\r\n");ADBG_APP("[P2PDEMO]MyAddress=0x%x,Group=0x%x\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));ADBG_APP("###############################################\r\n");m_input_type=INPUT_ADDRESS;postshowMenu();}/*从串口接收数据*/asynceventvoidUartStream.receivedByte(uint8_tc){if(c!='\r'){if(m_input_type==INPUT_DATA){/*输入数据*/uint8_t*payload=(uint8_t*)callPacket.getPayload(&m_msg,NULL);if(m_len>=callPacket.maxPayloadLength()){return;}payload[m_len++]=c;ADBG_APP("%c",c);if(m_len<callPacket.maxPayloadLength()){return;}}else{/*输入地址*/if(m_address_index<MAX_ADDRESS_LEN){m_address_str[m_address_index++]=c;ADBG_APP("%c",c);}if(m_address_index<MAX_ADDRESS_LEN){return;}}}/*按下回车键或者到达最大长度,如此处理*/if(m_input_type==INPUT_DATA){postsendData();}else{/*地址处理完毕,准备输入数据*/m_input_type=INPUT_DATA;postshowMenu();}}/**实现接口UartStream接口中的事件*/asynceventvoidUartStream.sendDone(uint8_t*buf,uint16_tlen,error_terror){}asynceventvoidUartStream.receiveDone(uint8_t*buf,uint16_tlen,error_terror){}/*射频接收数据*/eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){uint8_ti;callTimer1.startPeriodic(1000);ADBG_APP("\r\n*Receive,len=[%d],DATA:\r\n",ADBG_N(len));for(i=0;i<len;i++){ADBG_APP("%c",((uint8_t*)payload)[i]);}ADBG_APP("\r\n");LED_YELLOW_TOGGLE;m_input_type=INPUT_ADDRESS;}/*定时器事件处理函数*/eventvoidTimer1.fired()//定时器完毕后执行{postsendData1();//给节点2发送数据callTimer1.stop();}}实验截图实验心得通过这次实验,对点对点的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。对于延时发送可以通过定时器来实现也更为熟悉。实验七射频广播实验要求写一个射频广播实验,包括基站和两个节点的程序。使得两个节点在接收到基站的三个广播信号停止接收广播数据。实验思路添加全局变量,每次广播成功变量自减一次,判断是否为0,为0时停止广播。实验关键代码#defineDBG_LEV1000moduleBroadcastP{uses{interfaceBoot;interfaceAtosControl;interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;interfaceTimer<TMilli>asSensorTimer;}}implementation{message_tm_msg;inti=3;//定义控制广播次数的参数/*发送数据*/taskvoidsendData(){uint16_tm_len=0x00;uint8_t*payload=callPacket.getPayload(&m_msg,NULL);uint16_taddress=callAMPacket.address();*payload=0x01;m_len=0x01;if(address==0x01){callAMSend.send(0xFFFF,&m_msg,m_len);LED_BLUE_TOGGLE;}}/*发送完处理*/eventvoidAMSend.sendDone(message_t*msg,error_tsuccess){}/*节点启动完毕*/eventvoidBoot.booted(){/*开启射频*/callAtosControl.start();LED_YELLOW_ON;LED_BLUE_ON;callSensorTimer.startPeriodic(1000);}eventvoidSensorTimer.fired(){postsendData();}/*射频接收数据*/eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){LED_BLUE_TOGGLE;i=i-1;if(i==0)callAtosControl.stop();//每次广播完成后自减1,减到0时停止广播}}实验心得通过这次实验,对射频广播的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。实验八传感通信实验要求每次基站发送一个采集命令,发送1,节点每隔1s采集温湿度数据,发送2,节点每隔2s采集温湿度数据,以此类推,并且将采集的数据发送到基站。实验思路对上个实验P2PM的代码文件以与本实验的mSensor文件进展修改,基站发送数据包节点,数据中参数作为时间间隔,节点中参加一个计数器,对参数乘1000,即秒数。同时利用P2PM中的代码把本来发送的光照数据改为温湿度传感器数据。实验关键代码基站代码:#defineDBG_LEV1000modulemSensorBaseP{uses{interfaceBoot;interfaceStdControlasUartStdControl;interfaceUartStream;interfaceAtosControl;interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;}}implementation{enum{MAX_ADDRESS_LEN=5,INPUT_ADDRESS=0,INPUT_DATA=1,};message_tm_msg;uint8_tm_len=0;charm_address_str[MAX_ADDRESS_LEN]={0};uint8_tm_address_index=0;uint8_tm_input_type=0;/*显示菜单*/taskvoidshowMenu(){if(m_input_type==INPUT_DATA){/*等待输入欲发送的数据*/ADBG(DBG_LEV,"\r\n*ToSend:\r\n");}else{/*等待输入欲发送的地址*/ADBG(DBG_LEV,"\r\n###################################################\r\n*MYNodeId=0x%x,Group=0x%x,destination?\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));m_input_type=INPUT_ADDRESS;m_address_index=0;}}/*将从串口输入的地址字符串转化为真实地址*/uint16_tgetDestAddress(){uint16_taddress=0;uint8_ti=0;if(m_address_index>MAX_ADDRESS_LEN){m_address_index=MAX_ADDRESS_LEN-1;}for(i=0;i<m_address_index;++i){uint8_tdigital=m_address_str[i];if(digital>='A'&&digital<='F'){digital=digital-'A'+10;}elseif(digital>='a'&&digital<='f'){digital=digital-'a'+10;}elseif(digital>='0'&&digital<='9'){digital=digital-'0';}address=address*16+digital;}returnaddress;}/*发送数据*/taskvoidsendData(){uint8_ti;uint8_t*payload=callPacket.getPayload(&m_msg,NULL);uint16_taddress=callAMPacket.address();uint16_tdest_address=3;ADBG(DBG_LEV,"\npayload=%c\n",*payload);m_len=1;{ADBG(DBG_LEV,"\r\n\r\n*Sending...from[%d],to[%d],len=[%d]\r\n",ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len));callAMSend.send(dest_address,&m_msg,m_len);}LED_BLUE_TOGGLE;}/*发送完处理*/eventvoidAMSend.sendDone(message_t*msg,error_tsuccess){ADBG(DBG_LEV,"*Sent%s!\r\n",(success==SUCCESS)?"OK":"FAIL");m_len=0;m_input_type=INPUT_ADDRESS;postshowMenu();}/*从串口接收数据*/asynceventvoidUartStream.receivedByte(uint8_tc){if(c!='\r'){if(m_input_type==INPUT_DATA){/*输入数据*/uint8_t*payload=(uint8_t*)callPacket.getPayload(&m_msg,NULL);if(m_len>=callPacket.maxPayloadLength()){return;}*payload=c;ADBG(DBG_LEV,"%c",c);if(m_len<callPacket.maxPayloadLength()){return;}}else{/*输入地址*/if(m_address_index<MAX_ADDRESS_LEN){m_address_str[m_address_index++]=c;ADBG(DBG_LEV,"%c",c);}if(m_address_index<MAX_ADDRESS_LEN){return;}}}/*按下回车键或者到达最大长度,如此处理*/if(m_input_type==INPUT_DATA){postsendData();}else{/*地址处理完毕,准备输入数据*/m_input_type=INPUT_DATA;postshowMenu();}}/*节点启动完毕*/eventvoidBoot.booted(){/*开启射频*/callAtosControl.start();/*开启串口通信*/callUartStdControl.start();ADBG(DBG_LEV,"booted\n");LED_YELLOW_OFF;LED_BLUE_OFF;ADBG(DBG_LEV,"\r\n###############################################\r\n");ADBG(DBG_LEV,"MyAddress=0x%x,Group=0x%x\r\n",ADBG_N(callAMPacket.address()),ADBG_N(TOS_IEEE_PANID));ADBG(DBG_LEV,"###############################################\r\n");m_input_type=INPUT_ADDRESS;postshowMenu();}/**实现接口UartStream接口中的事件*/asynceventvoidUartStream.sendDone(uint8_t*buf,uint16_tlen,error_terror){}asynceventvoidUartStream.receiveDone(uint8_t*buf,uint16_tlen,error_terror){}/*射频接收数据*/eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){uint8_ti;ADBG(DBG_LEV,"\r\n*Receive,len=[%d],DATA:\r\n",ADBG_N(len));for(i=0;i<len-1;i++){ADBG(DBG_LEV,"Temp:%02x\n",(int)((uint8_t*)payload)[0]);ADBG(DBG_LEV,"Hum:%02x\n",(int)((uint8_t*)payload)[1]);}//显示接收到的温湿度数据ADBG(DBG_LEV,"\r\n");LED_YELLOW_TOGGLE;m_input_type=INPUT_ADDRESS;postshowMenu();}}节点代码:/**点对点射频通信实验示例程序authordate2010-1-11*/configurationmSensorNodeC{}implementation{ponentsmSensorNodeP;ponentsMainC;mSensorNodeP.Boot->MainC.Boot;ponentsnewTimerMilliC()asTimer1;mSensorNodeP.Timer1->Timer1;//添加定时器声明/*活动消息组件*/ponentsnewPlatformMacC(123);ponentsAtosMacC;mSensorNodeP.AtosControl->AtosMacC;mSensorNodeP.AMPacket->PlatformMacC;mSensorNodeP.Packet->PlatformMacC;mSensorNodeP.AMSend->PlatformMacC;mSensorNodeP.Receive->PlatformMacC;ponentsAtoSensorCollectionC;mSensorNodeP.AtoSensorCollection->AtoSensorCollectionC;ponentsSHTC;mSensorNodeP.SHT->SHTC;//使用温湿度传感器函数}#defineDBG_LEV9modulemSensorNodeP{uses{interfaceBoot;interfaceAtosControl;interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;interfaceAtoSensorCollection;interfaceSHT;interfaceTimer<TMilli>asTimer1;}}implementation{message_tm_sensor_msg;floatm_len=0;uintsensor_retry=0;boolm_sensoring=FALSE;uint8_tm_sensor_length=0;uint8_t*p_sensor_payload;uint16_tdest_address;floattemp,hum;//全局变量存储数据taskvoidsensorTask(){call

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论