8.简易无线通信
预备知识
- Zigbee无线通信,需要高频的载波来提供发射效率,Zigbee模块之间要可以正常的收发,接收模块必须把接收频率设置和发射模块的载波频率一致。
- Zigbee有27个载波可以进行通信,载波叫做信道(无线通信的通道)。这些载波的频率落在某些频率区段,我们把这些区段叫做频段。
- 2.4G频段 16个信道
- 915M频段 896M频段 11个信道
- 但TI的所有支持Zigbee底层协议的芯片只能在2.4G频段的16个信道里进行通信,即11-26信道。
- 网络地址:在Zigb
- ee无线局域网里,每一模块都一个在该网络里唯一的2个字节的地址,这个地址叫做网络地址,网络短地址。
- PANID:这是一个2个字节的编码,用来区别不同的Zigbee无线局域网,个域网ID.
代码分析
这里不在详细介绍,只给出关键配置代码的代码模板
对于数据发送接收的程序来说,基本的无线通信的基础配置是固定的,只需要知道里面需要自己每次更改的部分即可
将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字
SENDVAL到接收板,接收板通过数码管显示该数字
发送数据
分析
void halRfInit(void):无线通信初始化函数
void RFSend(char *pstr,char len):无线数据发送函数
__interrupt void RF_IRQ(void):无线通信中断函数
void RevRFProc():无线数据接收函数
无线通信初始化函数
在这个函数中,需要修改的只有
FREQCTRL和PAN_ID1两项的值



无线数据发送函数
可以直接看注释,这个函数基本不用改动,使用时直接掉这个函数就行,传入发送数组和数组长度即可

中断函数

发送数据包数组
char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
- 第一个字节0x0C含义,这个自己后面还有12个字节要发送,实际上是10(后面跟的)+2(默认自动添加的CRC 码)
- 第5 6个字节表示的是PANID
- 第7 8个字节是无线模块目标设备的网络地址 0xBEEF
- 第9 10就是本地模块的网络地址
- 11 个字节是我们有用的数据
- CRC码 12 13个字节 是硬件自动追加
主函数中的注意事项

发送数据模板代码
将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字SENDVAL到接收板,接收板通过数码管显示该数字
#include<iocc2530.h>
#include"74LS164_8LED.h"
#define SENDVAL 5char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送
//第5 6个字节表示的是PANID
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加void Delay()
{int y,x;for(y=1000;y>0;y--)for(x=30;x>0;x--);
}void Init32M()
{SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定Delay();CLKCONCMD &=0xF8;//1111 1000 不分频输出CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}void KeysIntCfg()
{//Key3 Key4 Key5IEN2|=0x10;//开P1IE组中断P1IEN|=0x02;//开Key3组内中断PICTL|=0x02;//设置P1_1为下降沿 EA=1; //开总中断
}
void halRfInit(void)
{EA=0;FRMCTRL0 |= 0x60;// Recommended RX settings TXFILTCFG = 0x09;AGCCTRL1 = 0x15;FSCAL1 = 0x00;// enable RXPKTDONE interrupt RFIRQM0 |= 0x40;//把射频接收中断打开// enable general RF interruptsIEN2 |= 0x01;//设置信道FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING); //设置载波为2475M//设置IDPAN_ID0=0x07;PAN_ID1=0x20; //0x2007 RFST = 0xEC;//清接收缓冲器RFST = 0xE3;//开启接收使能 EA=1;
}//发送无线数据
void RFSend(char *pstr,char len)
{char i;RFST = 0xEC; //确保接收是空的RFST = 0xE3; //清接收标志位while (FSMSTAT1 & 0x22);//等待射频发送准备好RFST = 0xEE;//确保发送队列是空RFIRQF1 &= ~0x02;//清发送标志位//为数据发送做好准备工作for(i=0;i<len;i++){RFD=pstr[i];} //循环的作用是把我们要发送的数据全部压到发送缓冲区里面RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去while(!(RFIRQF1 & 0x02) );//等待发送完成RFIRQF1 = ~0x02;//清发送完成标志
}void main()
{LS164_Cfg();//74LS164控制数码管的初始化Init32M(); //主时钟晶振工作在32M KeysIntCfg(); halRfInit();//无线通信的初始化 初始化相关的寄存器,配置工作信道,和PANIDSHORT_ADDR0=0x50;SHORT_ADDR1=0x20;//设置本模块地址 设置本模块的网络地址0x2050//大小端模式问题,LS164_BYTE(1); while(1);
}#pragma vector=P1INT_VECTOR
__interrupt void Key3_ISR() //P1_1
{if(0x02 & P1IFG){Delay();if(0==P1_1){ P1DIR |=0X01;P1_0 ^=1;RFSend(SendPacket,11);//发送数据} }P1IFG=0;P1IF=0;
}#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行EA=0;if( RFIRQF0 & 0x40 ){ RFIRQF0&= ~0x40; // Clear RXPKTDONE interrupt}S1CON= 0; // Clear general RF interrupt flagRFST = 0xEC;//清接收缓冲器RFST = 0xE3;//开启接收使能 EA=1;
}
接收数据
分析
初始化函数和发送数据的初始化函数一样,只需要把发送函数去掉,添加一个接收函数即可
注意
- 两相互通信的模块之间,初始化函数中的接收和发送的信道和PANID一定要一样
- 接收工程的主函数中设置的
SHORT_ADDR网络地址需要和发送的数据包中的第7、8两个字节所生成的网络地址一致
中断函数

无线数据接收函数

接收数据模板代码
将两个接收和发送的代码分别烧录到两个开发板中,实验现象是:发送板按下按键发送你设定的数字SENDVAL到接收板,接收板通过数码管显示该数字
#include<iocc2530.h>
#include"74LS164_8LED.h"
#define SENDVAL 5char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送
//第5 6个字节表示的是PANID
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加void Delay()
{int y,x;for(y=1000;y>0;y--)for(x=30;x>0;x--);
}void Init32M()
{SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定Delay();CLKCONCMD &=0xF8;//1111 1000 不分频输出CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}void halRfInit(void)
{EA=0;FRMCTRL0 |= 0x60;// Recommended RX settings TXFILTCFG = 0x09;AGCCTRL1 = 0x15;FSCAL1 = 0x00;// enable RXPKTDONE interrupt RFIRQM0 |= 0x40;//把射频接收中断打开// enable general RF interruptsIEN2 |= 0x01;//设置信道FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING); //设置载波为2475M//设置IDPAN_ID0=0x07;PAN_ID1=0x20; //0x2007 //halRfRxInterruptConfig(basicRfRxFrmDoneIsr); RFST = 0xEC;//清接收缓冲器RFST = 0xE3;//开启接收使能 EA=1;
}//接受无线数据
void RevRFProc()
{static char len;static char ch;len = ch = 0;RFIRQM0 &= ~0x40;IEN2 &= ~0x01;EA = 0;len = RFD;//读第一个字节判断这一串数据后面有几个字节;while (len > 0) {//只要后面还有数据那么就把他都从接受缓冲区取出来ch=RFD;if(3 == len){//读取倒数第三个字节的数字,通过数码管显示LS164_BYTE(ch);}len--;} EA=1;RFIRQM0 |= 0x40;// enable general RF interruptsIEN2 |= 0x01;
}void main()
{LS164_Cfg();//74LS164控制数码管的初始化Init32M(); //主时钟晶振工作在32M halRfInit();SHORT_ADDR0=0xEF;SHORT_ADDR1=0xBE;//设置本模块地址 0xBEEFLS164_BYTE(2); while(1);
}#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行EA=0;if( RFIRQF0 & 0x40 ){RevRFProc();RFIRQF0&= ~0x40; // Clear RXPKTDONE interrupt}S1CON= 0; // Clear general RF interrupt flagRFST = 0xEC;//清接收缓冲器RFST = 0xE3;//开启接收使能 EA=1;
}
相关文章:
8.简易无线通信
预备知识 Zigbee无线通信,需要高频的载波来提供发射效率,Zigbee模块之间要可以正常的收发,接收模块必须把接收频率设置和发射模块的载波频率一致。Zigbee有27个载波可以进行通信,载波叫做信道(无线通信的通道…...
渗透测试漏洞挖掘技巧
文章目录 一、使用.json进行敏感数据泄漏二、如何查找身份验证绕过漏洞三、在Drupal上找到隐藏的页面四、遗忘的数据库备份五、电子邮件地址payloads六、HTTP主机头:localhost七、通过篡改URI访问管理面板八、通过URL编码空格访问管理面板九、篡改URI绕过403十、Byp…...
Nginx - 反向代理与负载均衡
目录 一、Nginx 1.1、Nginx 下载 1.2、nginx 基础配置的认识 a)第一部分:全局块 b)第二部分:events 块 c)第三部分:http 块 http 块中 内嵌的 server 块 1.3、一些常用配置 1.3.1、location 匹配级…...
Linux网络编程系列之UDP组播
一、什么是UDP组播 UDP组播是指使用用户数据报协议(UDP)实现的组播方式。组播是一种数据传输方式,允许单一数据包同时传输到多个接收者。在UDP组播中,一个数据包可以被多个接收者同时接收,这样可以降低网络传输的负载和…...
设计模式~状态模式(state)-23
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状…...
linux环境下使用lighthouse与selenium
一、安装谷歌浏览器、谷歌浏览器驱动、lighthouse shell脚本 apt update && apt -y upgrade apt install -y curl curl -fsSL https://deb.nodesource.com/setup_18.x | bash apt install -y nodejs apt install -y npm npm install -g lighthouse apt-get install -y …...
NeuroImage | 右侧颞上回在语义规则学习中的作用:来自强化学习模型的证据
在现实生活中,许多规则的获取通常需要使用语言作为桥梁,特别是语义在信息传递中起着至关重要的作用。另外,个体使用的语言往往具有明显的奖励和惩罚元素,如赞扬和批评。一种常见的规则是寻求更多的赞扬,同时避免批评。…...
uni-app编程checkbox-group获取选中的每个checkbox的value值
uni-app编程checkbox-group获取选中的每个checkbox的value值_uniappcheckboxvalue-CSDN博客...
数组——螺旋矩阵II
文章目录 一、题目二、题解 题目顺序:代码随想录算法公开课,b站上有相应视频讲解 一、题目 59. Spiral Matrix II Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order. Example 1: Input: n …...
反范式化设计
反范式化设计与范式化设计相对立。范式化设计是将数据组织成多个表,以最小化数据的冗余和提高数据一致性。相反,反范式化设计是故意增加冗余,以提高查询性能和降低复杂性。反范式化设计通常用于需要高度优化的读取密集型应用程序,…...
CCF CSP认证 历年题目自练Day31
题目一 试题编号: 202206-1 试题名称: 归一化处理 时间限制: 500ms 内存限制: 512.0MB 题目背景 在机器学习中,对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为 0、方差为 1的标准分布&a…...
PCL点云处理之从两片点云中获取具有匹配关系的同名点对 (二百一十八)
PCL点云处理之从两片点云中获取具有匹配关系的同名点对 (二百一十八) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 点云配准的前提是,我们知道或者预测了一些匹配对,我们认为这些匹配对就是两片点云中的同名点,同名点就是由于激光扫描存在误差的关系,导致同一地物…...
MySQL Row size too large (> 8126)
错误信息 ERROR 1118 (42000) at line 901: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMATDYNAMIC or ROW_FORMATCOMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. 错误原因 这个问题…...
HUAWEI(26)——防火墙双机热备
一、拓扑 二、需求 PC2 ping PC1 FW1与FW2双机热备,FW1为active,FW2为Standby,抢占延时1s VRRP 三、配置 1.IP地址,防火墙接口加入区域 防火墙用户名:admin 防火墙旧密码:Admin@123 防火墙新密码:admin@123 [FW1]interface GigabitEthernet 1/0/0 [FW1-GigabitEthe…...
【ArcGIS】NDVI估算植被覆盖度FVC
NDVI估算植被覆盖度FVC NDVI计算植被覆盖度FVC计算NDVI估算植被覆盖度FVC操作步骤Step1:调出栅格计算器工具Step2:查找NDVIStep3: 参考 NDVI计算 植被覆盖度FVC计算 NDVI估算植被覆盖度FVC操作步骤 Step1:调出栅格计算器工具 1、首先打开软件&#x…...
vscode用密钥文件连接ssh:如果一直要输密码怎么办
commandshiftP:打开ssh配置文件 加上这么一段,host就是你给主机起的名字 对IdentityFile进行更改,改成相应的密钥文件 然后commandshiftP链接到主机就可以了 但是有时候它会让输入密码 这是由于你给这个IdentityFile的权限太多了…...
【AI视野·今日Robot 机器人论文速览 第五十三期】Thu, 12 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Thu, 12 Oct 2023 Totally 25 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Pixel State Value Network for Combined Prediction and Planning in Interactive Environments Authors Sascha Rosbach, St…...
【LeetCode第115场双周赛】100029. 和带限制的子多重集合的数目 | 前缀和背包 | 中等
题目内容 原题链接 给定一个长度为 n n n 的数组 n u m s nums nums 和一个区间左右端点 [ l , r ] [l,r] [l,r] 。 返回 n u m s nums nums 中子多重集合的和在闭区间 [ l , r ] [l, r] [l,r] 之间的 子多重集合的数目 。 子多重集合 指的是从数组中选出一些元素构成的 …...
ArcGIS笔记5_生成栅格文件时保存报错怎么办
本文目录 前言Step 1 直接保存到指定文件夹会报错Step 2 先保存到默认位置再数据导出到指定文件夹 前言 有时生成栅格文件时,保存在自定义指定的文件夹内会提示出错,而保存到默认位置则没有问题。因此可以通过先保存到默认位置,再数据导出到…...
YOLO目标检测——跌倒摔倒数据集【含对应voc、coco和yolo三种格式标签】
实际项目应用:公共安全监控、智能家居、工业安全等活动区域无监管情况下的人员摔倒事故数据集说明:YOLO目标检测数据集,真实场景的高质量图片数据,数据场景丰富。使用lableimg标注软件标注,标注框质量高,含…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
