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标注软件标注,标注框质量高,含…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
