基于LORA的一主多从监测系统_主从节点交互

devtools/2025/1/3 3:39:47/

上一步我们完成了子节点与PC交互,下面我们使用主节点和从节点进行交互,目前是一个主节点、单个从节点,相当于是一对一传输,主要的思路如下:

------>主节点发送问询帧

------>延时等待子节点回复

------>子节点回复

------>解析数据,判断数据的完整性,如果数据完整则对数据进行转化保存,等待上传

上面就是大概的流程,如果没有在指定时间收到子节点回复的数据则认为子节点收超时,进入到下一个节点的问询过程,这个过程基本都差不多,目前这个过程比较简单,没有太过复杂的东西,下面是我处理单个节点的函数,仅供参考。

//处理单个节点的具体操作
void GetLoraSlaveAData(void)
{char params[256] = {0};uint8_t RX_FLAG = 0;/*1、清除上次状态*//*清除串口接收长度*/LORA_RX_LENGTH = 0;/*清除标志位*/LORA_RX_FLAG = 0;/*清接收缓存*/memset(usart2RxBuff, 0, sizeof(usart2RxBuff));/*2、获取节点数据*/debug_print("\r\n获取A节点数据\r\n");debug_print("\n <------ Lora A Send: ");printBuffer(get_slave_A, sizeof(get_slave_A));loraSendData(get_slave_A, sizeof(get_slave_A));user_delay_ms(2000);/*3、等待节点回复*///while (elapsed_time < timeout_ms){//user_delay_ms(check_interval_ms); // 等待 500 毫秒//elapsed_time += check_interval_ms; // 更新已等待时间// 检查 LORA_RX_FLAGif (LORA_RX_FLAG == 1){LORA_RX_FLAG = 0;RX_FLAG = 1; //表示收到数据/*打印收到的节点A原始数据*/debug_print("\n ------> Lora A Recv: ");printBuffer(usart2RxBuff, LORA_RX_LENGTH);debug_print("\r\n收到应答:\r\n");/*解析数据*/if (parseFrame(usart2RxBuff, LORA_RX_LENGTH, &frameData)){/*获取当前的RSSI数据*/GetLoraRSSI();// 输出解析结果//这个地方用来打印解析的关键字,debug使用debug_print("\r\n应答设备地址: 0x%02X, 帧类型: %02X, 帧内容长度: %d\r\n", frameData.deviceAddress, frameData.keyword, frameData.frameLength);/*这个帧内容是包含校验和的*/debug_print("\r\n帧内容: ");printBuffer(frameData.frameContent, frameData.frameLength);
#if 0debug_print("\r\n");debug_print("\r\n校验和: %02X\r\n", frameData.checksum);
#endif/*解析温度*//*解析湿度*//*解析气压*/debug_print("\r\n温度: %.2f℃, 湿度: %.2f%%, 气压: %.2fhPa\r\n", rxNodeData.TEMP, rxNodeData.HUMB, rxNodeData.PRESS);/*组包准备上传*/snprintf(params, sizeof(params), "\"temp\":%.1f,\"humidity\":%.1f,\"pressure\":%.1f", rxNodeData.TEMP, rxNodeData.HUMB, rxNodeData.PRESS);//C511_TX_AliYun(1, params);memset(usart2RxBuff, 0, sizeof(usart2RxBuff));} else {debug_print("\r\n解析失败\r\n");}/*到这个地方说明已经接收到数据,不管有没有解析成功都要跳出循环*///break;}}// 判断是否超时if (RX_FLAG != 1){debug_print("\r\n节点A回复超时\r\n");}
}

下面是我实际测试过程中的debug截图:


http://www.ppmy.cn/devtools/130317.html

相关文章

skynet的cluster集群

集群的使用 现在的游戏服务器框架中&#xff0c;分布式是一种常见的需求。一个游戏服务器组通常可以分成网关服务器、登录服务器、逻辑服务器、跨服服务器等等。 在skynet中&#xff0c;我们可以通过cluster来组建一个集群&#xff0c;实现分布式的部署。 示例 我们先来看一…

Selenium的下载及chrome环境搭建

Selenium的下载及环境的搭建 1.安装python环境 conda 安装python环境《略》2.在CMD在使用pip下载Selenium pip install selenium #pip安装3.下载webdriver 进入Selenium的下载界面&#xff1a;https://www.selenium.dev/downloads/ 下拉找到Browsers 4、驱动与浏览器 ht…

duilib 进阶 之 TileListBox 列表

目录 一、TileListBox 1、样式 1)、整体列表分列设置 2)、列表项样式设置 3)、选中后出现√号,horver时 出现边框色 的实例 2、代码 1)、普通动态添加列表项 2)、列表项样式中有自定义控件时 3)、获得选中项 一、TileListBox Tile [taɪl] ,瓦片 棋子 Ti…

架构师之路-学渣到学霸历程-33

Nginx的常用命令 nginx的重点在于配置文件&#xff0c;但是我们也得懂得这些命令怎么使用的&#xff1b; 先了解一下nginx的命令&#xff1b;如下面笔记~&#xff01; 1、Nginx命令 Nginx的命令&#xff1a; 如果用yum安装的话&#xff0c;默认会添加到PATH路径如果用源码安…

华为配置 之 GVRP协议

目录 简介&#xff1a; 配置GVRP&#xff1a; 总结&#xff1a; 简介&#xff1a; GVRP&#xff08;GARP VLAN Registration Protocol&#xff09;&#xff0c;称为VLAN注册协议&#xff0c;是用来维护交换机中的VLAN动态注册信息&#xff0c;并传播该信息到其他交换机中&…

sqlite数据库数据迁移到mysql

使用Nvicat premium 1. 使用Nvicat premium打开sqlite数据库 我用的是sqlite3&#xff0c;所以填写连接名称然后选择数据库文件就可以了 2. 导出sqlite中的数据表 选择csv文件 全选表&#xff0c;然后下一步 继续下一步 默认设置就行了&#xff0c;下一步 完成之后点关…

白澍《暗河传》杀青 再演琅琊王萧若风引期待

近日&#xff0c;改编自周木楠同名小说&#xff0c;与《少年歌行》《少年白马醉春风》同来自“少歌宇宙”&#xff0c;由尹涛导演执导&#xff0c;龚俊、彭小苒领衔主演&#xff0c;乔振宇特别主演&#xff0c;常华森、杨雨潼领衔主演&#xff0c;张维娜、白澍等特别出演的古装…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…