LoRa开发7:PingPong系统
PingPong系统
1 引言
前2章介绍了SX1278的发送和接收,在此基础上,我们设计一个有趣的PingPong系统,更好地理解LoRa终端的收发逻辑。
该系统将LoRa终端自动定义成2种角色:master和slave。master主动发送ping数据帧,接收pong数据帧;slave如果接收到ping数据帧,回应pong数据帧。
2 整体逻辑流程
如上图所示,当LoRa终端上电后,在(2 * PingPongPeriod)周期内没有接收到ping数据帧,它就认为自己是master。Master节点每隔(1 * PingPongPeriod)周期主动发送ping数据帧,然后启动RF接收,可能接收到pong回应帧(正常通信),也可能接收超时(slave没有上电或通信失败)。
同理,当LoRa终端上电后,在(2 * PingPongPeriod)周期内接收到ping数据帧,它就认为自己是slave。Slave节点启动RF接收,如果接收到ping数据帧,它将发送pong回应帧。
一个节点从上电,判断自身角色,根据角色处理逻辑,如下流程图所示。
3 代码剖析
PROCESS_THREAD(PingPong, ev, data)
{
#definePING "ping, this is MASTER ofrime node."
#definePONG "pong, this is SLAVE of rimenode."
#definePING_SIZE 34
#definePONG_SIZE 33
staticbool s_bIsMaster;
staticuint16_t s_wPingPongPeriod;
staticint32_t s_lTxCnt = 0;
staticint32_t s_lRxCnt = 0;
PROCESS_BEGIN();
InitSetLoRa();
s_wPingPongPeriod =
SX1278GetTimeOnAir(4) + SX1278GetTimeOnAir(4) + 15; 1
/*Determine MASTER or SLAVE by RX "ping". */
SX1278Receive(2 * s_wPingPongPeriod); 2
PROCESS_YIELD(); /* Yield until receive or timeout. */ 3
SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */ 4
if(GetCompareRxFrame(PING, PING_SIZE)) 5
{
s_bIsMaster = FALSE;
}
else
{
s_bIsMaster = TRUE;
}
if(s_bIsMaster) /* Is MASTER */
{
while (1)
{
/* TX "ping" */
++s_lTxCnt;
SX1278Send(PING, PING_SIZE); 6
PROCESS_YIELD_UNTIL( (RF_Tx_Done == s_tRFResult) ||
(RF_Tx_Timeout ==s_tRFResult) ); 7
/* RX "pong" */
SX1278Receive(s_wPingPongPeriod); 8
PROCESS_YIELD(); /* Yield until receive a frame or timeout. */
SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */
if (GetCompareRxFrame(PONG, PONG_SIZE)) 9
{
++s_lRxCnt;
RIME_DBG( RIME_DBG_ON,
"TxCnt=%ld, Rx Cnt=%ld, SNR=%d, RSSI=%d.\r\n",
s_lTxCnt, s_lRxCnt, s_chPacketSnr,s_nPacketRssi ); 10
}
}
}
else /* Is SLAVE */
{
while (1)
{
/* RX "ping" */
SX1278Receive(0); 11
PROCESS_YIELD(); /* Yield until receive a frame or rx error. */
SX1278SetSleep(); /* MUST stop RxContinuous mode manually. */
if (GetCompareRxFrame(PING, PING_SIZE)) 12
{
/* TX "pong" */
++s_lTxCnt;
SX1278Send(PONG, PONG_SIZE); 13
PROCESS_YIELD_UNTIL( (RF_Tx_Done ==s_tRFResult) ||
(RF_Tx_Timeout == s_tRFResult) ); 14
++s_lRxCnt;
RIME_DBG( RIME_DBG_ON,
"Tx Cnt=%ld, RxCnt=%ld, SNR=%d, RSSI=%d.\r\n",
s_lTxCnt, s_lRxCnt,s_chPacketSnr, s_nPacketRssi );
}
}
}
PROCESS_END();
}
Line#1:计算PingPong通信空中时间,添加15ms做为收发准备时间;
Line#2:启动接收功能,超时时长为2倍PingPong通信空中时间;
Line#3:阻塞进程,直到接收数据帧或超时;
Line#4:设置SX1278为休眠,否则它将处于持续接收状态(那怕超时亦如此);
Line#5:GetCompareRxFrame()复制数据帧到解析工作区,比较是否为ping帧;
Master节点逻辑
Line#6:master节点发送ping数据帧;
Line#7:阻塞进程,直到发送ping数据帧完毕;
Line#8:启动接收功能,超时时长为PingPong通信空中时间;
Line#9:比较是否为pong回应帧;
Line#10:打印发送和接收数据帧个数,SNR和RSSI值;
Slave节点逻辑
Line#11:启动持续接收功能,为0表明关闭超时功能;
Line#12:比较是否为ping数据帧;
Line#13:slave节点发送pong回应帧;
Line#14:阻塞进程,直到发送pong回应帧完毕;
LoRa开发7:PingPong系统相关推荐
- LoRa开发与应用之路八
LoRa 智慧牧场项目集成开发 在前面的课程内容当中,我们已经学习完了一整套 LoRa 开发的过程,并且在前面一节实现了基于时分复用 MAC 协议的自组网络设计,可以说已经具备了 LoRa 集成开发的 ...
- Lora开发 USR-LG220 + WH-L101
Lora开发 USR-LG220 + WH-L101 背景 USR-LG220 + WH-L101 配置 USR-LG220配置 恢复出厂值,有个reload按钮. 无线网搜索连接"USR- ...
- LoRa开发与应用之路二
LoRa 开发环境搭建 STM32CubeMX 安装及使用 STM32CubeMX 简介 市面上常见的 LoRa 模块都是搭配 STM32 芯片的单片机来使用的,所以使用 ST 公司的软件和产品是入门 ...
- LoRa开发板升级的时候,为什么需要修改跳线帽?
一般来说,LoRa开发板都会提供boot选择,也就是从哪个区域启动.很多是采用跳线帽的方式来进行boot选择的,这也导致了LoRa开发板升级的时候,往往需要修改跳线帽. LoRa开发板的跳线帽位置的示 ...
- 日本京都大学 77TB重要数据被删;元宇宙要凉?Meta停止开发 VR/AR系统。 | 一周 IT 资讯...
惠普公司闯大祸!日本京都大学超算系统77TB重要数据被删:滴滴宣布裁员,幅度达20%:Meta 停止开发 VR/AR 操作系统,独立自主计划受挫:2021年编程语言排行榜出炉,Python稳居榜首:T ...
- Thinkphp5 开发 OA 办公系统 - 数据库设计
2019独角兽企业重金招聘Python工程师标准>>> 自从接触到用PowerDesigner做数据库建模后,喜欢它就停不下来了.我发现现在很多2-20人的团队在做数据库结构设计时, ...
- AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
开篇 上一篇我们主要是讲述了如何根据数据库原型设计器提供的相关功能来构建ORM提供的相关信息,例如根据数据库与实体对象之间通过数据原型来进行双向的映射.本篇 我们将会根据上篇<AgileEAS. ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
用SignalR 2.0开发客服系统[系列3:实现点对点通讯] 原文:用SignalR 2.0开发客服系统[系列3:实现点对点通讯] 前言 目录: 用SignalR 2.0开发客服系统[系列1:实现群 ...
- python嵌入式系统开发_Python在开发实时嵌入式系统中的作用
原标题:Python在开发实时嵌入式系统中的作用 在过去的几年里,Python已经成为一种热门的程序语言.以著名的Monty Python喜剧小组命名,该语言是面向对象和解释.该属性导致Python在 ...
最新文章
- mysql 应用前景_图数据库在企业应用中前景如何,相比关系型数据库有哪些优势?...
- Selector选择器概述||Selector选择器组合使用
- Port Forwarding Port Triggering
- 中国合同环境服务行业规划可行性及运营动态分析报告2022-2028年
- boost::math::quadrature::naive_monte_carlo用法的测试程序
- ZOJ-3494 BCD Code (ac自动机+数位dp)
- centos虚拟机ping不通 报错 name or service not known
- 安卓游戏开发用什么引擎_游戏开发学习第一天————用什么软件
- (127)FPGA面试题-介绍FPGA 门控时钟
- asp.net ashx处理程序中switch case的替代方案总结
- springboot项目license_license · 开源的SpringBoot前后端分离项目/framework - Gitee.com
- 我的实用设计模式之关于Policy-based design
- python 爬虫 客户端_python爬虫
- javaScript视频弹幕
- 存储和多屏互动,蜂鸟网的NAS应用解析
- 洞察——风格注意力网络(SANet)在任意风格迁移中的应用
- 常见的字符编码ascii、gb2312、utf-8和base64的规则
- IT工程师 毕业4年我年薪涨到30万
- 力扣1845——座位预约管理系统(优先队列)
- 有三个线程T1,T2,T3,下面方法可以确保它们按顺序执行的有()该线程继续执行