实验5--点对点无线通讯实验
更新时间:2023-10-02 20:37:01 阅读量: 综合文库 文档下载
- 点对点无线模块推荐度:
- 相关推荐
实验题目:实验5--点对点无线通讯实验 实验时间:2015.12.2
一、 实验目的:
使用IAR开发环境设计R程序,利用2个CC2530 ZigBee模块实现点对点无线通讯。
二、 实验原理及程序分析:
a) 硬件接口原理
ZigBee(CC2530)模块 LED 硬件接口
ZigBee(CC2530)模块硬件上设计有 2 个 LED 灯,用来编程调试使用。分别连接 CC2530 的 P1_0、P1_1两个 IO 引脚。从原理图上可以看出,2 个 LED 灯共阳极,当 P1_0、P1_1 引脚为低电平时候,LED 灯点亮。
b) ? 关键函数
1、 射频初始化函数 uint8 halRfInit(void)
功能描述:zigbee 通信设置,自动应答有效,设置输出功率0dbm,Rx设置,接收中断
有效。
参数描述: 无
返回: 配置成功返回 SUCCESS
2、发送数据包函数
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)
功能描述:发送包函数。
入口参数:destAddr 目标网络短地址 pPayload 发送数据包头指针, length 包的大小 出口参数:无
返 回 值:成功返回SUCCESS,失败返回FAILED
3、接收数据函数
uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi) 功能描述: 从接收缓存中拷贝出最近接收到的包。 参数: 接收数据包头指针
1
接收包的大小
返回: 实际接收的数据字节数
c) 软件设计
void main (void) {
uint8 i;
appState = IDLE; // 初始化应用状态为空闲 appStarted = FALSE; // 初始化启动标志位FALSE /* 初始化Basic RF */
basicRfConfig.panId = PAN_ID; // 初始化个域网ID basicRfConfig.ackRequest = FALSE; // 不需要确认 halBoardInit();
if(halRfInit()==FAILED) //初始化hal_rf HAL_ASSERT(FALSE);
/* 快速闪烁8次led1,led2 */ for(i = 0; i < 16; i++) {
halLedToggle(1); // 切换led1的亮灭状态 halLedToggle(2); // 切换led2的亮灭状态 halMcuWaitMs(50); // 延时大约50ms }
halLedSet(1); // led1指示灯亮,指示设备已上电运行halLedClear(2);
basicRfConfig.channel = 0x0B; // 设置信道 #ifdef MODE_SEND
appTransmitter(); // 发送器模式 #else
appReceiver(); // 接收器模式 #endif
HAL_ASSERT(FALSE); }
void appTransmitter() {
uint32 burstSize=0; uint32 pktsSent=0; uint8 appTxPower; uint8 n;
/* 初始化Basic RF */
basicRfConfig.myAddr = TX_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) {
HAL_ASSERT(FALSE); }
/* 设置输出功率 */
2
//appTxPower = appSelectOutputPower(); halRfSetTxPower(2);//HAL_RF_TXPOWER_4_DBM // halRfSetTxPower(appTxPower);
/* 设置进行一次测试所发送的数据包数量 */ //burstSize = appSelectBurstSize(); burstSize = 100000;
/* Basic RF在发送数据包前关闭接收器,在发送完一个数据包后打开接收器 */
basicRfReceiveOff(); /* 配置定时器和IO */ //n= appSelectRate(); appConfigTimer(0xC8); //halJoystickInit(); /* 初始化数据包载荷 */ txPacket.seqNumber = 0;
for(n = 0; n < sizeof(txPacket.padding); n++) {
txPacket.padding[n] = n; }
/* 主循环 */ while (TRUE) {
if (pktsSent < burstSize) {
UINT32_HTON(txPacket.seqNumber); // 改变发送序号的字节顺序 basicRfSendPacket(RX_ADDR, (uint8*)&txPacket, PACKET_SIZE); /* 在增加序号前将字节顺序改回为主机顺序 */ UINT32_NTOH(txPacket.seqNumber); txPacket.seqNumber++; pktsSent++;
appState = IDLE;
halLedToggle(1); //切换LED1的亮灭状态 halLedToggle(2); //切换LED2的亮灭状态 halMcuWaitMs(1000); }
/* 复位统计和序号 */ pktsSent = 0; } }
static void appReceiver() {
uint32 segNumber=0; // 数据包序列号
int16 perRssiBuf[RSSI_AVG_WINDOW_SIZE] = {0}; // 存储RSSI的环形缓冲 uint8 perRssiBufCounter = 0; // 计数器用于RSSI缓冲区统计 perRxStats_t rxStats = {0,0,0,0}; // 接收状态
3
int16 rssi;
uint8 resetStats=FALSE;
int16 MyDate[10]; //串口数据串数字 initUART(); // 初始化串口 #ifdef INCLUDE_PA uint8 gain;
// 选择增益 (仅SK - CC2590/91模块有效) gain =appSelectGain(); halRfSetGain(gain); #endif
/* 初始化Basic RF */
basicRfConfig.myAddr = RX_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) {
HAL_ASSERT(FALSE); }
basicRfReceiveOn(); /* 主循环 */ while (TRUE) {
while(!basicRfPacketIsReady()); // 等待新的数据包
if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {
halLedSet(1); // 点亮LED1 //halLedSet(2); // 点亮LED2
UINT32_NTOH(rxPacket.seqNumber); // 改变接收序号的字节顺序 segNumber = rxPacket.seqNumber;
/* 若果统计被复位,设置期望收到的数据包序号为已经收到的数据包序号 */
if(resetStats) {
rxStats.expectedSeqNum = segNumber; resetStats=FALSE; }
rxStats.rssiSum -= perRssiBuf[perRssiBufCounter]; // 从sum中减去旧的RSSI值
perRssiBuf[perRssiBufCounter] = rssi; // 存储新的RSSI 值到环形缓冲区,之后它将被加入
sum
rxStats.rssiSum += perRssiBuf[perRssiBufCounter]; // 增加新的RSSI值到sum
MyDate[4] = rssi; ////
MyDate[3] = rxStats.rssiSum;////
if(++perRssiBufCounter == RSSI_AVG_WINDOW_SIZE) {
4
perRssiBufCounter = 0;
}/* 检查接收到的数据包是否是所期望收到的数据包 */
if(rxStats.expectedSeqNum == segNumber) // 是所期望收到的数据包 {
MyDate[0] = rxStats.expectedSeqNum;//// rxStats.expectedSeqNum++; }
else if(rxStats.expectedSeqNum < segNumber) // 不是所期望收到的数据包(收到的数据包的序
号大于期望收到的数据包的序号) { // 认为丢包
rxStats.lostPkts += segNumber - rxStats.expectedSeqNum; MyDate[2] = rxStats.lostPkts;///
rxStats.expectedSeqNum = segNumber + 1; MyDate[0] = rxStats.expectedSeqNum;/// }
else // 不是所期望收到的数据包(收到的数据包的序号小于期望收到的数据包的序号)
{ // 认为是一个新的测试开始,复位统计变量 rxStats.expectedSeqNum = segNumber + 1; MyDate[0] = rxStats.expectedSeqNum;/// rxStats.rcvdPkts = 0; rxStats.lostPkts = 0; }
MyDate[1] = rxStats.rcvdPkts;/// rxStats.rcvdPkts++;
UartTX_Send_String(MyDate,5); halMcuWaitMs(300);
halLedClear(1); //熄灭LED1 halLedClear(2); //熄灭LED2 halMcuWaitMs(300); } } }
5
流程图
三、 实验步骤及结果:
在IAR开发环境中编译、运行、调试程序。注意,本工程需要编译两次,一次编译发送器的,一次编译为接收器的,通过MODE_SEND宏选择,并分别下载入2个ZigBee模块中。
四、 实验心得:
无
6
正在阅读:
实验5--点对点无线通讯实验10-02
我的植物朋友300字作文06-18
电力拖动基础试卷08-12
2010年高考文综经济生活主观题分类整理05-05
浅谈关于单亲家庭的教育06-19
2015年版镇江市电子加工产业园区规划及招商策略咨询研究报告04-06
专题一物质的分类分散系06-24
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 无线通讯