点对多点通信实验
- 格式:docx
- 大小:31.51 KB
- 文档页数:8
《传感网原理及应用》实验报告专业班级:物联网工程姓名: ##学号: ##########指导教师:###评阅成绩:评阅意见:提交报告时间:2015年 12月 8日目录实验二点对多点通信实验1、实验目的…………………………………………………………………………2、实验内容…………………………………………………………………………3、实验步骤…………………………………………………………………………4、实验现象描述与实验结果分析…………………………………………………5、实验思考…………………………………………………………………………实验一点对点通信实验一、实验目的在对点对点无线通信理解的基础上,学习如何利用CC531实现zigbee模块的点对多的无线通信。
学习如何使用IAR的工程选项区分相同功能模块的不同处理,即一个工程中如果有多个RX该如何进行分别的处理。
二、实验内容让两台接收机接收同一台zigbee模块发送的数据,收到数据后通过小灯闪烁表示成功接收或发送数据。
三、实验步骤1.打开IAR工程“per_test.eww “2.打开工程文件后,进入工程界面:3. 在IAR工程中选择RF状态后,分别下载到三个zigbee模块中;1)选择发送状态TX,然后下载到zigbee模块中,作为点对多点无线无线通信的发送方;2)分别选择接收状态RX1和RX2,然后分别下载到zigbee模块中,作为点对多点无线通信的两个接收方。
四、实验现象描述与实验结果分析此为实验报告的重点部分,需要详细描述,包括1.对实验现象的描述三个zigbee模块中,作为发送端的zigbee模块黄灯闪烁,作为接收端的两个zigbee模块红灯和黄灯都闪烁.2.对实验结果的描述运行的结果是发送和接收模块上的小灯交替闪烁。
1) Zigbee数据发送模块:zigbee发送模块上电后,黄灯开始闪烁,表示数据已经正常发送,黄灯每闪烁一次,表示数据成功向两个zigbee模块轮询发送出去一次;2) Zigbee数据接收模块:zigbee接收模块RX1和RX2上电后,红灯一直闪烁,表示接收模块正常工作,准备好了接收工作;若接收模块上的黄灯闪烁,则表示接收到了zigbee数据发送模块的数据,黄灯闪烁一次表示成功接收到一次空口数据。
3.结合程序深入分析实验现象和结果1)在主程序中,使用条件编译#ifdefTX,即:如果在IAR工程中的Options预编译了TX,则调用函数appTransmitter(),如果定义了RX,则调用函数appMultiReceiver();否则调用appReceiver(),目的是为了区分在同一个程序中同时编写的TX(发送)、RX1和RX2(接收程序)。
void main (void){uint8appMode;appState = IDLE;appStarted = FALSE;// RF射频配置basicRfConfig.panId = PAN_ID;basicRfConfig.ackRequest = FALSE;// 板卡硬件初始化halBoardInit();// 初始化RF射频if(halRfInit()==FAILED) {HAL_ASSERT(FALSE);}halMcuWaitMs(350);// 设置通信信道,2.4GHz的zigbee基于IEEE802.15.4标准,一共定义了16个信道//basicRfConfig.channel = appSelectChannel(); //此处可以通过配置按键来自己定义选择信道basicRfConfig.channel = Channels[2]; //Channel 13, 2415MHz// Set mode//appMode = appSelectMode();#ifdef TXappTransmitter(); //若定义为TX状态,进入发送方的主循环,执行发送操作,//由发送节点调用发送函数#elif defined RXappMultiReceiver(); //若定义为RX状态,进入接收方的主循环,执行接收操作,//由接收节点调用接收函数1#elseappReceiver(); //否则接收节点调用接收函数2#endifHAL_ASSERT(FALSE);}2)发送端:发送程序主要功能为循环发送数据,程序开始同样初始化CC2531射频部分和内部CPU后,开始循环对不同目的地址发送数据,当数据发送成功后,黄灯闪烁一次,表示数据成功轮询发送一次。
发送函数调用函数basicRfSendPacket()向地址RX_ADDR和地址RX1_ADDR循环发送数据。
static void appTransmitter(){uint32burstSize=0;uint8appTxPower;uint8 n;// Initialize BasicRFbasicRfConfig.myAddr = TX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED) {HAL_ASSERT(FALSE);}// 设置发送功率//HAL_RF_TXPOWER_0_DBM, see hal_rf.c for definationshalRfSetTxPower(HAL_RF_TXPOWER_2_5_DBM);// 设置burst sizeburstSize=BURST_SIZE_1;//关闭射频接收功能basicRfReceiveOff();// 初始化 packet payloadtxPacket.seqNumber = 0;for(n = 0; n < 8; n++){txPacket.padding[n] = Send_data[n];}// 主循环while(1){LED1 = 1;basicRfSendPacket(RX_ADDR, (uint8*)&txPacket, PACKET_SIZE);halMcuWaitMs(800);basicRfSendPacket(RX1_ADDR, (uint8*)&txPacket, PACKET_SIZE);LED1 = 0;halMcuWaitMs(800);}}2)接收端:接收程序主要功能为接收zigbee发送过来的数据。
RX1和RX2分别调用函数appMutiReceiver()和appReceiver()来进行不同的数据接收处理。
static void appMultiReceiver(){int16rssi;uint8RxStatus = 0;//初始化射频basicRfConfig.myAddr = RX1_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}basicRfReceiveOn();while (TRUE){LED1 = 1;LED2 = 1;if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {if(rxPacket.padding[1] != 0){RxStatus = 1;memset((uint8*)&rxPacket, 0, MAX_PAYLOAD_LENGTH);}while(RxStatus == 1){LED1 = !LED1;halMcuWaitMs(50);RxStatus = 0;}}halMcuWaitMs(50);LED2 = 0;halMcuWaitMs(50);}}static void appReceiver(){int16rssi;uint8RxStatus = 0;// 初始化射频basicRfConfig.myAddr = RX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}basicRfReceiveOn();while (TRUE){LED1 = 1;LED2 = 1;if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {if(rxPacket.padding[1] != 0){RxStatus = 1;memset((uint8*)&rxPacket, 0, MAX_PAYLOAD_LENGTH);}while(RxStatus == 1){LED1 = !LED1;halMcuWaitMs(50);RxStatus = 0;}}halMcuWaitMs(50);LED2 = 0;halMcuWaitMs(50);}}4)实验过程:1)先将发送端信号设为Channels[2]2)使用条件编译#ifdefTX来为两个接收端设置不同的信道,即:如果定义了RX,则信道为channel[2],否则设置信道为channel[3]3)在主循环中,发送端的信道初始为channel[2],向信道channel[2]发送数据之后等待0.8秒,然后将发送端的信道改为channel[3],再向信道channel[3]发送数据。
等待0.8秒之后,再次循环。
如此,发送端不断切换自己的信道,向两个接收端发送消息。
五、拓展思考本实验是通过在发送端对要发送的目的地址进行增加,然后轮询进行发送,实现了点对多点的zigbee无线通信,本实现还可以采用FDMA(频分多址)来实现,即改变数据收发的频率,让zigbee设备切换不同的信道去监测空口数据或者利用不同的信道对数据进行发送,但是我们这次实验的时候只用了两个模块来测试,两个模块之间的影响很小,但是在现实生活中不可能只有两个模块,肯定是非常多的模块。