硬汉嵌入式论坛

 找回密码
 立即注册
查看: 238|回复: 1
收起左侧

[其它] LoRa一主多从方案

[复制链接]

38

主题

231

回帖

345

积分

高级会员

积分
345
发表于 2025-12-23 10:55:16 | 显示全部楼层 |阅读模式
本帖最后由 LinY 于 2025-12-23 11:37 编辑

这个帖子讲的方案和背景,具体对接看另外一个帖子:
LoRa协议配置参数问题
https://forum.anfulai.cn/forum.p ... 30572&fromuid=50087
(出处: 硬汉嵌入式论坛)



项目背景:部分项目设备安装位置没有LTE信号,需要通过中转方式将数据上传业务平台。考虑过RS485有线方式但是部分项目现场无法接线,所以决定试用LoRa方式。

方案:采用Lora一主多从方式将从机数据获取到并存到w25qxx中,然后通过4G上传数据。

MCU:STM32L431
Lora模块:SX1276模块
通过SPI对接

目前主机从机都是同一个设备共用一套代码,主机和从机一样也支持进行传感器读数,通过配置从机id区分是主机还是从机,0表示主机,1-32表示从机。
从机只允许在接收到主机指令的情况下给主机返回数据,不允许私自上报。

指令格式:从机id+功能码+crc+网络ID,其中从机id+功能码+crc刚好使用modbus-rtu协议规范,便于后期拓展RS485
主要指令:
1.广播更新从机时间,通过0x00/0xFF作为从机id广播给所有从机,更新从机时间,从机获取到后更新设备时间,不需要返回。
这个指令会单开handler处理,比如定时30秒广播一次,不与业务关联。
2.获取从机本次传感器数据,通过从机id和包序号包大小从对应从机获取数据。
从包0开始,包大小固定64字节,循环读取。
如果有一次返回从机还未完成数据采集就先轮训下一个从机,如果有数据返回就包序号一直轮训直至从机返回的包大小<64字节
如果从机还未完成数据采集,直接返回对应未成状态。
如果从机已经完成数据采集,根据包序号和大小返回对应大小数据并在返回数据中带上包序号和包大小。
刚开始对接,这里本来直接就是一整条数据的,后来从256字节强行减少到192字节,发现还是丢包严重效果不理想,后来才做的分包,分成1个包64字节,加上其他字节在72字节左右。
3.通知对应从本次传感器数据获取完成。
主机在轮训获取传感器数据时,如果发现某个从机的所有数据已经获取到了,就给对应从机发送已经全部获取到的指令,从机再获取到此指令之后就会返回已收到通知并按照逻辑进入休眠流程。

在此这基础上,主机和从机都有一个超时时间,从传感器读数完成之后开始计时,超过时间直接结束Lora通讯流程。主机超时后直接上报flash中的数据然后走休眠流程。从机超时后直接走休眠流程。

目前已知可以优化的方向:
1.这个方案要求主机和从机的时间必须一致,也就是主机给从机广播时间一定要成功,否则后面休眠唤醒可能不是同时唤醒。
后面准备尝试将主机唤醒间隔缩短至从机的1/2或者1/3,但是这个要考虑耗电了。
或者主机如果判断当前有个别主机没人任何通讯成功的情况下,每隔一小段时间启动然后广播几次时间然后休眠,直至下一次获取通讯成功。
2.中间如果有主机没有拿到当前从机数据,这次数据就不会上传,虽然从机数据也会保存至设备flash,但是没法实时获取到,后面我再想再做2个指令,一个读取对应从机待上传数据数量,一个读取对应从机最近一条待上传数据,尝试轮训获取。

主机和从机都是将RX到的内容放到队列中去的,队列在另外一个任务处理的。

第一次使用LoRa,这个方案麻烦各位给看看还有没有优化的空间或者哪里还有问题

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
发表于 2025-12-23 16:20:08 | 显示全部楼层
业务逻辑越简单越好,就用MODBUS RTU,每个轮询设置个超时,超时后不再处理,等下轮再读,继续使用上次数值。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-10 07:37 , Processed in 0.042355 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表