TS实验报告.docx
- 文档编号:30739841
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:41
- 大小:24.42KB
TS实验报告.docx
《TS实验报告.docx》由会员分享,可在线阅读,更多相关《TS实验报告.docx(41页珍藏版)》请在冰豆网上搜索。
TS实验报告
计算机科学与技术学院、软件学院
学生实验报告
实验题目:
基于ATOS平台的物联网实验
学生姓名:
指导教师:
专业班级:
提交日期:
实验一LED组件
1.1实验要求
绿灯一直处于熄灭的状态,红灯不停闪烁(注意:
工具箱提
供的代码有bug,对于基站节点LED_BLUE-红灯LED_YELLOW->
绿灯Of和OFF逻辑相反)
1.2实验思路
将绿灯状态改为OFF红灯通过时间延迟控制其的亮灭。
1.3实验关键代码
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灯*/}
}
/**启动事件处理函数,在LED.nc已经关联到MainC.Boot
接口
系统启动后会调用此函数
*/
eventvoidBoot.booted()
{postDemoLed();
}
}
1.4实验截图
1.5实验心得
通过这次实验,掌握了对LED的简单控制,受益匪浅,并且对此次实验的运作过程开始了解。
实验二定时器组件
1.1实验要求
通过定时器让绿色灯闪烁,并且闪烁三次后停止闪烁。
1.2实验思路
设置一个变量,在计时器每计数一次自加一次,加到三时,停止
计时器。
1.3实验关键代码
#defineDBG_LEV5
moduleTimerLedM
{
usesinterfaceBoot;
/*Timer为系统接口TMilli指明了定时器的精度为毫秒*/usesinterfaceTimer
usesinterfaceTimer
}
implementation
{
/**任务:
切换黄色LED灯*/
inti=0;
/**启动事件处理函数,在TimerLed.nc已经关联到
MainC.Boot接口系统启动后会调用此函数
*/
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();
}
1.4实验截图
1.5实验心得
通过此次实验,加强了我对代码的思考,更加了解定时器函数的使用。
实验三串口调试
1.1实验要求
通过级别控制,使得某些调试语句没有被输出到串口。
1.2实验思路
默认的ADBG_LE为3000,将语句中的DBG_LEV参数改为比默认的ADBG_LEV、即可
1.3实验关键代码
/**
串口调试程序的实现模块
@date*/
/*定义调试级别,参加Makefile的ADBG_LEVE定义,设置大于等于ADBG_LEVEL*/
#defineDBG_LEV3000
moduleSerialDebugM
{
usesinterfaceBoot;
}
implementation
{
/**任务:
通过串口打印信息来调试*/
taskvoidDebugSerial()
{
uint8_tnum1=0x39;
uint32_tnum2=
floatfloat1=123.1234;
/**ADBG,格式类似于printf,
第一个参数为调试等级,可以参见tos/lib/common/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);
}
/**启动事件处理函数,在SerialDebug.nc已经关联到MainC.Boot接口
系统启动后会调用此函数
*/
eventvoidBoot.booted()
postDebugSerial();
}
}
1.4实验截图
图1未屏蔽前
图2屏蔽后
1.5实验心得
此次实验加深了我对串口的了解与使用,是一次非常好的实验材料,受益匪浅。
实验四串口通信
1.1实验要求
实现一个串口实验,在串口助手中实现回显的功能。
(键盘键入的任何内容回车后显示在串口助手的终端)
1.2实验思路
直接在原有的UartStream.receivedByte函数基础上修改,
直接输出结果
1.3实验关键代码
串口输入输出程序的实现模块
@author
@date
*/
#include
/**定义此宏,将演示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]Togg
leBLUELED\r\n[2]
ToggleYELLOWLED\r\n");
/*通过UartStream.send可以发送字节数据*/
callUartStream.send(m_send_buf,strlen(m_send_buf));
}
/**启动事件处理函数,在SerialIo.nc已经关联到
MainC.Boot接口
系统启动后会调用此函数
*/
eventvoidBoot.booted()
{
LED_BLUE_ON;LED_YELLOW_ON;callUartStdControl.start();
showMenu();
}
asynceventvoidUartStream.sendDone(uint8_t*buf,uint16tlen,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)
{
}
}
1.4实验截图
1.5实验心得
通过这次实验,对串口通信的原理有了大致的了解,同时也更加深刻了我对这门课的认识,巩固了我的理论知识。
实验五FLASH读写
1.1实验要求
自己定义一个结构体,并且将结构体的内容写入到0x1fff8,并且在写完后将结构体的数据读取出来和原始数据进行比较。
1.2实验思路
将原有代码的读写数组改成结构体中的数组即可
1.3实验关键代码
/*定义调试级别,参加Makefile的ADBG_LEVE定义,设置大于
等于ADBG_LEVEL*/
#defineDBG_LEV3000
moduleTestFlashC
{
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 { ADBG(DBG_LEV,"arr.ieee3[%d]=%d\n",(int)i,(int)arr.ie ee3[i]); } } eventvoidBoot.booted() { ADBG(DBG_LEV,"Boot.booted\n"); postinitTask(); } } 1.4实验截图 1.5实验心得 通过这次实验,对FlASH读写的原理有了大致的了解,同时 也更加深刻了我对这门课的认识,巩固了我的理论知识。 实验六点对点通信 1.1实验要求 完成一个两跳点对点的传输,让基站给节点1发送一个消息,节点1在接收到消息后将自己的蓝灯状态改变,延迟1s后将消息继续传递给节点2,节点2在接收到消息后将自己的黄灯状态改变。 1.2实验思路 1.3实验关键代码 基站节点同节点2 #defineDBG_LEV1000 moduleP2PM { 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 { 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 { return; } } else {/*输入地址*/if(m_address_index m_address_str[m_address_index++]=c;ADBG_APP("%c",c); }if(m_address_index return; } } /*按下回车键或者到达最大长度,则处理*/if(m_input_type==INPUT_DATA) { postsendData(); } else { /*地址处理完毕,准备输入数据*/ m_input_type=INPUT_DATA;postshowMenu(); } } /**实现接口UartStream接口中的事件*/ asynceventvoidUartStream.sendDone(uint8_t*buf,uint16tlen,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 { ADBG_APP("%c",((uint8_t*)payload)[i]); } ADBG_APP("\r\n"); LED_YELLOW_TOGGLE;m_input_type=INPUT_ADDRESS; } } 节点1: (P2PC中添加Timer1的定时器声明) configurationP2PC { }implementation { componentsP2PM;componentsMainC; P2PM.Boot->MainC.Boot; /*串口收发组件*/componentsPlatformSerialC; P2PM.UartStdControl->PlatformSerialC;P2PM.UartStream->PlatformSerialC; /*活动消息组件*/componentsnewPlatformMacC(123);componentsAtosMacC; P2PM.AtosControl->AtosMacC;P2PM.AMPacket->PlatformMacC; P2PM.Packet->PlatformMacC;P2PM.AMSend->PlatformMacC; P2PM.Receive->PlatformMacC;componentsnewTimerMilliC()asTimer1; P2PM.Timer1->Timer1;//添加Timer1的定时器声明 } #defineDBG_LEV1000moduleP2PM { uses{ interfaceBoot; interfaceAtosControl; interfaceStdControlasUartStdControl;interfaceUartStream; interfaceAMSend;interfaceReceive;interfaceAMPacket;interfacePacket;interfaceTimer
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TS 实验 报告