当前位置: 首页 > news >正文

EFR32MG21模组(Zigbee)与STM32单片机通信

EFR32MG21模组(Zigbee)与STM32单片机通信

介绍: 通过本次的通信可以实现单片机通过Zigbee控制开关设备,比如zigbee智能开关,智能插座,以及模拟量的数据上传

  • EFR32 是 Silicon Labs 面向物联网的低功耗多协议无线 SoC系列,基于 ARM Cortex‑M3/M33 内核,覆盖 Sub‑GHz 与 2.4 GHz 频段,支持 ZigBee、Thread、BLE、Matter 等协议,广泛应用于智能家居、工业自动化、智能能源等领域。
    在这里插入图片描述
    1、本次主要是单片机与通信文档的一个初步的解析
    在这里插入图片描述
    也就是针对这片文章的开关示例的简单的分析
    在这里插入图片描述
    2、主要分协议内容以及协议的分析
    在这里插入图片描述
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bf35fc9e909e47a8ac9621e22a6003c8.png在这里插入图片描述
    主要
  • 主要是层命令和子命令,需要严格按照协议的规定,有固定的数据帧,对固定的数据帧进行读取判断
// ================== 开关网络时间 ==================
void Zigbee_OpenNetwork(uint8_t seconds)
{uint8_t buf[32];uint8_t len = 0;buf[len++] = 0xFE;buf[len++] = 0x0B;buf[len++] = 0x02;buf[len++] = 0x01;buf[len++] = 0x02;buf[len++] = 0x00;buf[len++] = 0x00;buf[len++] = 0x00;buf[len++] = 0x04;buf[len++] = seconds;buf[len]   = ZigBee_CalcChecksum(buf, len);USART2_SendBuffer(buf, len + 1);Serial_Printf("打开网络允许入网,时长=%d 秒\r\n", seconds);
}

进行开网的数据发送,然后通过中断获取数据帧
在这里插入图片描述
串口调试助手进行实时的打印数据进行监控
遇到问题
进行获取端点数据的发送


//获取端点数据
void Zigbee_QueryEndpoint(uint16_t shortAddr)
{uint8_t buf[32];uint8_t len = 0;buf[len++] = 0xFE;buf[len++] = 0x0A;buf[len++] = 0x02;buf[len++] = 0x03;buf[len++] = 0x02;buf[len++] = (uint8_t)(shortAddr & 0xFF);buf[len++] = (uint8_t)(shortAddr >> 8);buf[len++] = 0x00;buf[len++] = 0x05;buf[len]   = ZigBee_CalcChecksum(buf, len);USART2_SendBuffer(buf, len + 1);Serial_Printf("查询端点\r\n");
}

在这里插入图片描述

且重复读取中断点

  • 解决办法,清零

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进行修改
在这里插入图片描述
修改之后再次进行调试
在这里插入图片描述
打印结果正确

获取到设备第二条响应

此时会获取到错误帧,注意看手册 02 83 的数据帧为正确,03 83 为错误
在这里插入图片描述
查询设备成功
在这里插入图片描述

if((ZigBeeGetData.RxBuf[2]==0X02) && (ZigBeeGetData.RxBuf[3]==0X43))//获取设备端点的响应{Serial_Printf("查询端点的第1条响应\r\n");memset(ZigBeeGetData.RxBuf,0,ZigBeeGetData.Rx_count);ZigBeeGetData.Rx_count = 0;ZigBeeGetData.Rx_over = 0;while(ZigBeeGetData.Rx_over==0);if(ZigBeeGetData.Rx_over == 1){if((ZigBeeGetData.RxBuf[2]==0X02) && (ZigBeeGetData.RxBuf[3]==0X83))//获取设备端点的响应{Serial_Printf("查询端点的第2条响应\r\n");if((Zigbee_AddState ==Z_AddLemp)&&(ZigBeeGetData.RxBuf[2]==0X02)){Z_DeviceLib.Dev[ZigBeeAddNem].Device_Num = ZigBeeGetData.RxBuf[10];for(int i=0;i<ZigBeeGetData.RxBuf[10];i++){Z_DeviceLib.Dev[ZigBeeAddNem].Device_list[i]= ZigBeeGetData.RxBuf[11+i];}flag_zigbee0=1;Zigbee_AddState = GetType;LED1_OFF();
//								Serial_Printf("----跳出循环----");	}}	}}
  • 进行查询端点的所有服务
  • 在这里插入图片描述获取端点服务成功
  • 第二条回应的数据帧
    在这里插入图片描述
    进行开关的控制状态
    发送状态转换的0x02
    这里需要注意的是传入的参数,是终端设备的短地址,每次连接都不一样,
void Zigbee_Switch(uint16_t shortAddr,uint16_t endpoint,uint16_t status)
{uint8_t buf[32];uint8_t len = 0;buf[len++] = 0xFE;buf[len++] = 0x0B;buf[len++] = 0x05;buf[len++] = 0x01;buf[len++] = 0x02;buf[len++] = (uint8_t)(shortAddr&0xFF);buf[len++] = (uint8_t)(shortAddr>>8);buf[len++] = (uint8_t)(endpoint);buf[len++] = 0x0A;  							//帧序列号buf[len++] = status;								//属性值buf[len]   = ZigBee_CalcChecksum(buf, len); USART2_SendBuffer(buf, len + 1);Serial_Printf("已发送改变开关状态\r\n");
}

在这里插入图片描述在这里插入图片描述
最后完成对开关状态的获取
在这里插入图片描述整体流程已实现

注意事项;硬件烧录次数超过5次之后,建议需要重新上电启动,不然串口打印会出现错误

http://www.dtcms.com/a/398453.html

相关文章:

  • 部署的git仓库地址变更后更改新地址
  • 加强部门网站建设wordpress验证码失效
  • 昆山做网站的jofuns商务网站开发课程体会
  • PyTorch 神经网络模型构建与训练笔记(2)
  • 某旅游学院网络安全项目:构建高效监控集中管理与巡检系统
  • 【开题答辩全过程】以 J2EE应用于母婴健康管理系统的开发与实施为例,包含答辩的问题和答案
  • 网站设计与制作公司中铁中基建设集团网站
  • 怎么样自己做百度网站做网站什么主题好做
  • es的java调用
  • Jenkins运维之路(初次调试共享库)
  • 离线下载npm包
  • 【UE5.6.1】UE5初学者教程学习笔记:编辑器操作 (1-7集)
  • 伊春seo公司seo网站页面诊断
  • Spring依赖注入:@Resource与@Autowired详解及避免空指针的最佳实践
  • 52Hz——FreeRTOS学习笔记——延时函数
  • 阿里巴巴做网站教程免费网站模板下载大全下载
  • 贪心算法之分数背包问题
  • LLMs之AgentDevP:FastGPT的简介、安装和使用方法、案例应用之详细攻略
  • 贪心算法之船舶装载问题
  • 面试_常见大厂面试题
  • 网站地图怎么建设wordpress文章页样式修改
  • 网站如何做交互热门seo推广排名稳定
  • 【第29话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
  • React学习教程,从入门到精通,React Router 语法知识点及使用方法详解(28)
  • Docker Compose 从入门到实践
  • D3.js 与数据可视化
  • RNA-seq分析之最佳cutoff(TCGA版)
  • 浏览器直接进入网站的注意事项钢筋网片价格
  • scrapy-redis项目:爬取某网站图书信息
  • (论文速读)DiffBlender:可组合和通用的多模态文本到图像扩散模型